GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
|
141 KB
52 KB
|
115ms
98ms
|
Document
text/html |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
source-sans-pro-v11-latin-700.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
15 KB
15 KB
|
13ms
11ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-700.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
|
GET
H2
|
200
|
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
15 KB
16 KB
|
11ms
10ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
|
GET
H2
|
200
|
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
16 KB
16 KB
|
10ms
8ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
30ms
6ms
|
Script
application/javascript |
151.101.114.217
Fastly
|
|
General
- Full URL
- https://cdn.speedcurve.com/js/lux.js?id=131387135
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.217
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
Apache /
- Resource Hash
- 8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
pre-aa86d418eb.js
Show response
www.giga.de/static-local/dist/assets/js/
|
59 KB
19 KB
|
12ms
11ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-03da6b597b.css
www.giga.de/static-local/dist/assets/css/
|
365 KB
51 KB
|
14ms
13ms
|
Stylesheet
text/css |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
34 KB
11 KB
|
35ms
12ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H2
|
200
|
metaTag.min.657a01ec7fb251299e30ce55c6b195af.js
Show response
js.stroeermediabrands.de/
|
249 KB
60 KB
|
39ms
12ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
27 KB
10 KB
|
23ms
5ms
|
Script
application/javascript |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
|
796 B
1 KB
|
32ms
15ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/05/2501-rcm40x40.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
103 KB
37 KB
|
35ms
20ms
|
Script
text/javascript |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 304ae66279a84ab5174685bd0d52365d0daf5077d4f4d6a3de7d2d3602903252
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
paypal-login-deutsch-rcm960x0.jpg
static.giga.de/wp-content/uploads/2015/07/
|
18 KB
19 KB
|
29ms
12ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/07/paypal-login-deutsch-rcm960x0.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.jpg
crops.giga.de/0a/ad/ab/
|
16 KB
17 KB
|
38ms
20ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://crops.giga.de/0a/ad/ab/2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- a0611e486e87faf678d732cede5f2b94c26550f87a9e8baf6393ac3e8f96268b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
PayPal-Login-Page-rcm464x0.jpg
static.giga.de/wp-content/uploads/2015/07/
|
21 KB
21 KB
|
37ms
20ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/07/PayPal-Login-Page-rcm464x0.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 2f58ccf14355919dfa5815bebd82d775161bdf2707480201bd8b2334778c0412
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
Adobe-Flash-Player-Artikelbild-rcm200x113.jpg
static.giga.de/wp-content/uploads/2017/11/
|
6 KB
7 KB
|
28ms
12ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2017/11/Adobe-Flash-Player-Artikelbild-rcm200x113.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 94e13caa719e008d2469c149493b7ee21334e264ab298ad7533d7598f9986caf
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
FreeFileSync-rcm200x113.jpg
static.giga.de/wp-content/uploads/2018/03/
|
7 KB
8 KB
|
28ms
11ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2018/03/FreeFileSync-rcm200x113.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- c7e6b1dcc86227fc39b041454dbe6fbbab2efee73f711d5c9e9e420f605d9415
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
8GadgetPack-Artikelbild-rcm200x113.jpg
static.giga.de/wp-content/uploads/2015/06/
|
4 KB
5 KB
|
36ms
20ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/06/8GadgetPack-Artikelbild-rcm200x113.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 3e8c5db7711c41175192a3bceb1ce4289fb52cddf958b9ab39afd3f5e65b6b66
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
Siri-Geld-verschicken-PayPal-rcm235x129.jpg
static.giga.de/wp-content/uploads/2016/11/
|
6 KB
6 KB
|
13ms
13ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2016/11/Siri-Geld-verschicken-PayPal-rcm235x129.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
-
https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
-
https://ssl-econa.met.vgwort.de/blank.gif
|
43 B
310 B
|
6ms
5ms
|
Image
image/gif |
161.156.66.178
SoftLayer Technol...
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
349 B
|
38ms
13ms
|
Image
image/gif |
2a03:2880:f107:83:face:b00c:0:25de
Facebook
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
202 B
|
24ms
13ms
|
Image
image/gif |
2a03:2880:f107:83:face:b00c:0:25de
Facebook
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
43 KB
18 KB
|
18ms
6ms
|
Script
text/javascript |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-aa86d418eb.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
apstag.js
Show response
c.amazon-adsystem.com/aax2/
|
76 KB
22 KB
|
35ms
20ms
|
Script
application/javascript |
143.204.90.253
Amazon.com
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
991 B
917 B
|
25ms
12ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
203 B
|
30ms
9ms
|
XHR
application/vnd.api+json |
193.46.63.75
INFONLINE-AS
|
|
General
- Full URL
- https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=software_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.07858809035194736
- Requested by
- Host: script.ioam.de
URL: https://script.ioam.de/iam.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
193.46.63.75
Alfter, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- irqs.ioam.de
- Software
-
nginx /
- Resource Hash
- 9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H/1.1
|
200
OK
|
blank.gif
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=001c&i2=001c107c47eaa38735dac17f2&ep=1597392089&vr=415&i...
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=001c&i2=001c107c47eaa38735dac17f2&ep=1597392089&vr=415&i...
-
https://de.ioam.de/blank.gif
|
43 B
651 B
|
10ms
9ms
|
Image
image/gif |
91.215.100.40
INFONLINE-AS
|
|
|
GET
H2
|
200
|
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
|
9 KB
10 KB
|
10ms
9ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
176875
Show response
videos.giga.de/embed/
Frame 4158
|
9 KB
3 KB
|
48ms
21ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
|
647 B
865 B
|
8ms
7ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.0
|
200
OK
|
z.js
Show response
go.giga-abs.de/
|
1 KB
1 KB
|
32ms
7ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/z.js?0.9326878839101078
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame 95B2
Redirect Chain
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
|
0
0
|
20ms
20ms
|
Document
text/html |
23.37.53.21
Akamai Technologies
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.37.53.21
, Netherlands,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a23-37-53-21.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
46 KB
15 KB
|
52ms
40ms
|
Script
text/javascript |
172.217.23.98
Google LLC
|
|
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
288 KB
89 KB
|
42ms
8ms
|
Script
application/javascript |
52.85.183.6
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
124 KB
48 KB
|
21ms
6ms
|
Script
text/javascript |
2.18.233.67
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://tracking.m6r.eu/sync/dmp
-
https://tracking.m6r.eu/sync/dmp?checkcookies=true
|
97 B
597 B
|
56ms
56ms
|
XHR
application/json |
23.37.53.21
Akamai Technologies
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/74d74908-c9bc-4d56-89b9-8f49f992f3a9/si.nuggad.net/
Redirect Chain
-
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
-
https://nugmw.userreport.com/rc-ap/74d74908-c9bc-4d56-89b9-8f49f992f3a9/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2...
|
2 KB
2 KB
|
48ms
26ms
|
Script
text/javascript |
2600:9000:2156:ca00:1f:a1b:34c0:93a1
Amazon.com
|
|
General
- Full URL
- https://nugmw.userreport.com/rc-ap/74d74908-c9bc-4d56-89b9-8f49f992f3a9/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:2156:ca00:1f:a1b:34c0:93a1
, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- 8654a6bc43ea8e930c8d078a059064854e518bca10dc06a0328d681223319eb5
|
GET
H/1.1
|
200
OK
|
ad-loading.gif
www.dunkirkinception.com/detect/
|
123 B
434 B
|
60ms
9ms
|
Image
image/png |
18.195.39.206
Amazon.com
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
30ms
8ms
|
Script
application/javascript |
2600:9000:200c:ee00:15:efbc:e300:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
14 KB
14 KB
|
15ms
8ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
post-24c513bb8a.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
13ms
12ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-e4340d5047.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
31 KB
12 KB
|
14ms
13ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
smb-phone-plan-ef34ebe4f8.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
|
53 KB
18 KB
|
13ms
12ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
656 B
|
30ms
16ms
|
Script
application/javascript |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.giga.de
- 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:81b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
656 B
|
30ms
16ms
|
Script
application/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.giga.de
- 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:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/
|
238 KB
88 KB
|
30ms
29ms
|
Script
text/javascript |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
- 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:81b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 1a58095266eb45b55188805f4507e88c0fa62d1fc111b67585e98a9f8b1c4e4e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191015/r20190131/
Frame E467
|
0
0
|
17ms
5ms
|
Document
text/html |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20191015/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:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
js
Show response
www.google-analytics.com/gtm/
|
86 KB
27 KB
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:815::200e
Google LLC
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
122 B
504 B
|
78ms
77ms
|
XHR
text/javascript |
143.204.90.253
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=8574748600401571559410586&cb=3270118744381571559410588&ws=1600x1200&v=7.37.01&t=1000&slots=%5B%7B%22sd%22%3A%22banner-1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%22rectangle-4%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.90.253
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-90-253.fra50.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- 8b8719da0e1eda32a276e216293573e344ba7e7b338d60f66ff5b062aea9d8f7
|
GET
H2
|
200
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
22ms
6ms
|
XHR
application/javascript |
143.204.90.253
Amazon.com
|
|
|
GET
H2
|
200
|
article-rating-7143c629e5.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
306 B
534 B
|
9ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
loader.js
Show response
c.nativendo.de/cdn/asset/js/
|
54 KB
17 KB
|
73ms
19ms
|
Script
application/javascript |
2606:4700:20::6819:ad0d
Cloudflare
|
|
|
GET
H2
|
200
|
videojs-02e1d46d.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame 4158
|
618 KB
206 KB
|
47ms
46ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame 4158
|
271 KB
92 KB
|
55ms
41ms
|
Script
text/javascript |
2a00:1450:4001:815::200a
Google LLC
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
6ms
6ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/o.gif?__ir=&__is=1600_1200_24&__iu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&__id=1571559410606&__it=-120&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- 2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
|
GET
H/1.1
|
200
OK
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
80ms
18ms
|
Script
application/javascript |
178.19.65.130
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ad11c.-GZHNrMf0.gif
www.giga.de/imagex/
|
71 B
474 B
|
34ms
32ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
platform.js
Show response
apis.google.com/js/
|
48 KB
19 KB
|
44ms
31ms
|
Script
application/javascript |
2a00:1450:4001:818::200e
Google LLC
|
|
General
- Full URL
- https://apis.google.com/js/platform.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-aa86d418eb.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
ESF /
- Resource Hash
- 3752aa6373c6cffb52d27da513bdd2f0b543bbe61b3ae7d56fd0c27c74367fd2
- 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
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
113 KB
22 KB
|
20ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame 4158
|
53 KB
15 KB
|
18ms
18ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame 4158
|
1015 B
1 KB
|
19ms
18ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame DDD4
|
0
0
|
311ms
310ms
|
Document
text/html |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1571559410&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&dt=1571559410555&bpp=7&bdt=217&fdt=127&idt=127&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&correlator=7292501559291&frm=20&pv=2&ga_vid=1728711666.1571559411&ga_sid=1571559411&ga_hid=2096249048&ga_fc=0&iag=0&icsg=563001627507394&dssz=58&mdo=0&mso=0&u_tz=120&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=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=3239548346350458&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=tKFUlcOoKo&p=https%3A//www.giga.de&dtd=139
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 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/
|
77 KB
29 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
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/r20191015/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f425f66d90f1150499b36ab47b56fa6fb1a68136e4f42befca20a920ff85306b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
|
85 KB
30 KB
|
17ms
5ms
|
Script
text/javascript |
2a00:1450:4001:819::200a
Google LLC
|
|
|
GET
H2
|
200
|
pubads_impl_2019101401.js
Show response
securepubads.g.doubleclick.net/gpt/
|
156 KB
57 KB
|
40ms
40ms
|
Script
text/javascript |
172.217.23.98
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
submit
lb33.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
13ms
1ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb33.s400.meetrics.net/bb-mx/submit?/bHXvBGAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSXQBPAAAAAAAAAOAAAAGAAAAAAAZwSXQBBRksFAQtjFo3d9SA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb33.s400.meetrics.net/
|
43 B
308 B
|
12ms
0ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 8E35
|
0
0
|
16ms
16ms
|
Document
text/html |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1571559410&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1571559410563&bpp=5&bdt=225&fdt=188&idt=188&shv=r20191015&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=7292501559291&frm=20&pv=1&ga_vid=1728711666.1571559411&ga_sid=1571559411&ga_hid=2096249048&ga_fc=0&iag=0&icsg=826785377290&dssz=61&mdo=0&mso=0&u_tz=120&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=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=3239548346350458&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=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=193
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191015/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
124 B
|
30ms
27ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=2096249048&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=6GBAAEADQ~&jid=340269935&gjid=1874405602&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&z=900415769
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
14ms
11ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=2096249048&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd21=auto&cm17=1&cd18=4282584&z=2097841452
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
14ms
11ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=2096249048&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=275040721
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
13ms
10ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=2096249048&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=674709420
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
13ms
10ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=2096249048&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm75=1&z=468112044
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
12ms
10ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=2096249048&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=502543862
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
11ms
9ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=2096249048&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=1511121115
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
11ms
9ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=2096249048&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=188826719
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
11ms
9ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=2096249048&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=1567151669
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
197 B
|
10ms
8ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=2096249048&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=974870007
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame C7F0
Redirect Chain
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
|
0
0
|
200ms
200ms
|
Document
text/html |
52.94.218.7
Amazon.com
|
|
General
- Full URL
- https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.94.218.7
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
2ms
1ms
|
Image
image/png |
188.40.16.106
HETZNER-AS
|
|
General
- Full URL
- https://gocp.stroeermediabrands.de/t.png?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&contentPieceId=2857946&publishDate=2016-09-22T12%3A38%3A19%2B02%3A00&_=1571559410788.-28561654
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.16.106
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.106.16.40.188.clients.your-server.de
- Software
-
/
- Resource Hash
- ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
|
GET
H2
|
200
|
impl.20191016-8-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
393 KB
112 KB
|
7ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
beacon.js
Show response
sb.scorecardresearch.com/
|
1 KB
1 KB
|
20ms
7ms
|
Script
application/x-javascript |
23.43.115.95
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
smb-article-rating-f9506c2d61.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
|
18 KB
6 KB
|
10ms
10ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
21ms
7ms
|
Script
text/javascript |
2001:4de0:ac19::1:b:2a
Highwinds Network...
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
11 KB
5 KB
|
311ms
311ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3239548346350458&correlator=643884347116842&output=ldjh&impl=fif&adsid=NT&eid=21064803&vrg=2019101401&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191020&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=800x450%7C580x500%7C580x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D14%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26mbrid%3D88f7c511abc193e2d0c384db1731593e%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1571559410&dt=1571559410933&dlt=1571559410338&idt=579&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3541345729&uci=1&ifi=2&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=65&icsg=13228566036658&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&ga_vid=1728711666.1571559411&ga_sid=1571559411&ga_hid=2096249048&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019101401.js?21064803
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b82e19494a766c9e9774c0bf157e223524761626fb14f5c208039ed5165ad627
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019101401.js
Show response
securepubads.g.doubleclick.net/gpt/
|
64 KB
24 KB
|
39ms
39ms
|
Script
text/javascript |
172.217.23.98
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
|
0
0
|
19ms
6ms
|
Other
text/html |
2a00:1450:4001:81f::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019101401.js?21064803
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81f::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
3 KB
2 KB
|
305ms
305ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3239548346350458&correlator=643884347116842&output=ldjh&impl=fif&adsid=NT&eid=21064803&vrg=2019101401&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191020&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=1x1&ists=1&scp=as%3Dout-of-page%26adslot%3Dout-of-page%26pc%3D1&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D14%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26mbrid%3D88f7c511abc193e2d0c384db1731593e%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1571559410&dt=1571559410943&dlt=1571559410338&idt=579&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858038163&uci=2&ifi=3&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=66&icsg=13228566036658&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&ga_vid=1728711666.1571559411&ga_sid=1571559411&ga_hid=2096249048&fws=640&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019101401.js?21064803
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 21a201980f0be6311f8c142eeaf0d9deedb260a57645e52cb8539bf6d0a97117
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
nuggad
ih.adscale.de/
|
49 B
487 B
|
15ms
15ms
|
Image
image/gif |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
cdn.m6r.eu/sync/
|
1 KB
1 KB
|
19ms
6ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
5 KB
1 KB
|
15ms
15ms
|
Stylesheet
text/css |
2606:4700:20::6819:ad0d
Cloudflare
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
122 B
506 B
|
92ms
92ms
|
XHR
text/javascript |
143.204.90.253
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=8574748600401571559410586&cb=8849532123051571559410957&ws=1600x1200&v=7.37.01&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%2C%7B%22sd%22%3A%22sky%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22200x600%22%2C%22120x600%22%5D%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.90.253
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-90-253.fra50.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- 77cfd8ae3f8bace14431b93a30a779f35d751159fa3b37ab80a080a24053cb32
|
POST
H2
|
204
|
translator
Show response
hbopenbid.pubmatic.com/
|
0
113 B
|
122ms
96ms
|
XHR
text/plain |
185.64.189.112
PubMatic
|
|
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
1 KB
2 KB
|
31ms
31ms
|
XHR
application/json |
37.252.173.27
AppNexus
|
|
|
GET
H2
|
200
|
arj
Show response
yieldlove-d.openx.net/w/1.0/
|
4 KB
5 KB
|
43ms
29ms
|
XHR
application/json |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=cefdbcee-111b-4fd7-9ada-86eaa8ff9e5d%2Cf6b5801a-5fc1-43b1-b695-bb6154e46c05%2C5848e841-8f83-4a47-a312-a91a9695c018&nocache=1571559410966&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle%2Csky%2Cbanner&auid=539390940%2C540714782%2C540847469&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.163.0 /
- Resource Hash
- 35b0d5f011f577f7e4a2898bd2cb1de69bc52e6febd17f79c99d394e90bfc5a8
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
116ms
69ms
|
XHR
application/json |
185.86.139.59
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
98ms
51ms
|
XHR
application/json |
185.86.139.59
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
1 KB
|
217ms
169ms
|
XHR
application/json |
185.86.139.59
SMARTADSERVER
|
|
|
GET
H2
|
200
|
ADTECH;apid=1Af7f7dc48-f311-11e9-a379-02599a0636ac;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1571559410968
Show response
adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/
Redirect Chain
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1571559410968;
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1571559410968
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6658212/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1571559410968
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6658212/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=2;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1571559410968
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;apid=1Af7f7dc48-f311-11e9-a379-02599a0636ac;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1571559410968
|
48 B
268 B
|
16ms
16ms
|
XHR
application/json |
152.199.22.2
MCI Communication...
|
|
General
- Full URL
- https://adserver.adtech.de/pubapi/3.0/4538.1/6658212/0/0/ADTECH;apid=1Af7f7dc48-f311-11e9-a379-02599a0636ac;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x250_1;misc=1571559410968
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
152.199.22.2
, United States,
ASN15133
(EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
- Reverse DNS
- Software
-
Adtech Adserver /
- Resource Hash
- 6d1550f58c3faebdaf72cd93ac43e366cdbd0dee5c60d34914f9d912b23a9bc7
|
GET
H2
|
200
|
ADTECH;apid=1Af7f7dcc0-f311-11e9-a7e8-022c6bfdcf50;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1571559410968
Show response
adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/
Redirect Chain
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1571559410968;
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1571559410968
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6670994/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1571559410968
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6670994/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=2;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1571559410968
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;apid=1Af7f7dcc0-f311-11e9-a7e8-022c6bfdcf50;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1571559410968
|
48 B
241 B
|
18ms
18ms
|
XHR
application/json |
152.199.22.2
MCI Communication...
|
|
General
- Full URL
- https://adserver.adtech.de/pubapi/3.0/4538.1/6670994/0/0/ADTECH;apid=1Af7f7dcc0-f311-11e9-a7e8-022c6bfdcf50;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_300x600_2;misc=1571559410968
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
152.199.22.2
, United States,
ASN15133
(EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
- Reverse DNS
- Software
-
Adtech Adserver /
- Resource Hash
- d56b85e0a42ae4035dec671552dbe2cc7d9b7225f26620e4b7b7a625751216ac
|
GET
H2
|
200
|
ADTECH;apid=1Af7f8b3de-f311-11e9-a327-02aeddb920d2;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1571559410968
Show response
adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/
Redirect Chain
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1571559410968;
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1571559410968
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6669693/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1571559410968
-
https://adserver-eu.adtech.advertising.com/pubapi/3.0/4538.1/6669693/0/0/ADTECH;rdhost=adserver.adtech.de;cfp=2;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1571559410968
-
https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;apid=1Af7f8b3de-f311-11e9-a327-02aeddb920d2;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1571559410968
|
48 B
241 B
|
12ms
12ms
|
XHR
application/json |
152.199.22.2
MCI Communication...
|
|
General
- Full URL
- https://adserver.adtech.de/pubapi/3.0/4538.1/6669693/0/0/ADTECH;apid=1Af7f8b3de-f311-11e9-a327-02aeddb920d2;cfp=1;rndc=1571559410;v=2;cmd=bid;cors=yes;alias=giga.de_d_970x250_2;misc=1571559410968
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
152.199.22.2
, United States,
ASN15133
(EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
- Reverse DNS
- Software
-
Adtech Adserver /
- Resource Hash
- a01ea66daca897c5683e97c91d36cf0e34e7bc6ee0dd8f22bb8db2f48bebf6f7
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
145 B
|
60ms
29ms
|
XHR
text/plain |
35.206.134.202
Google LLC
|
|
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
144 B
|
84ms
53ms
|
XHR
text/plain |
35.206.134.202
Google LLC
|
|
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
144 B
|
84ms
53ms
|
XHR
text/plain |
35.206.134.202
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
cygnus
Show response
as-sec.casalemedia.com/
|
25 B
901 B
|
130ms
116ms
|
XHR
application/json |
2.18.234.21
Akamai Technologies
|
|
General
- Full URL
- https://as-sec.casalemedia.com/cygnus?s=254711&v=7.2&r=%7B%22id%22%3A%222541735d780e8fa%22%2C%22imp%22%3A%5B%7B%22id%22%3A%2226c9d43797452ce%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22254711%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%2227b3145a7766e9f%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%22285752d25b2505e%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%222996d950e53f55f%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%22302f4cb7dd8eab%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2231b1746c11c3afd%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%22329f9224035561f%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%22338df8ad463de4%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%2234fac543d15f87%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.234.21
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-234-21.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf67a4dc75dfb0aa3cb46fb17e3a56a51c847c08e609027cbb5c3c0252815bd4
|
POST
H2
|
204
|
v1
Show response
dmx.districtm.io/b/
|
0
415 B
|
188ms
113ms
|
XHR
text/plain |
104.16.68.69
Cloudflare
|
|
General
- Full URL
- https://dmx.districtm.io/b/v1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.68.69
, United States,
ASN13335
(CLOUDFLARENET - Cloudflare, Inc., US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
366 B
1 KB
|
33ms
23ms
|
XHR
application/json |
37.252.173.27
AppNexus
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
/
d.agkn.com/iframe/8613/
Frame AFE4
|
0
0
|
62ms
22ms
|
Document
text/html |
52.28.148.3
Amazon.com
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=449573488&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
- Requested by
- Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.28.148.3
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-28-148-3.eu-central-1.compute.amazonaws.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
GET
H2
|
200
|
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/
Frame 4158
|
30 KB
30 KB
|
61ms
30ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://files.giga-video.de/75/ed/96/145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
|
40 KB
10 KB
|
27ms
6ms
|
Script
text/javascript |
151.101.13.194
Fastly
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=2096249048&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.0%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.0&cd44=1&cm1=1&z=1983122314
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
BLOB
|
200
OK
|
ba1dbe23-6ffd-4b2e-9381-2618c773cc8d
https://videos.giga.de/
Frame 4158
|
31 B
0
|
|
Other
application/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame 4158
|
53 B
642 B
|
50ms
11ms
|
XHR
application/json |
52.219.74.155
Amazon.com
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 4158
|
265 B
436 B
|
24ms
23ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
16 KB
7 KB
|
256ms
240ms
|
Script
application/javascript |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=10%3A16%3A51.085<i=deflated&data=%7B%22id%22%3A703%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1571559411077%2C%22cv%22%3A%2220191016-8-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A5143%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-t2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22cd%22%3A3738.296875%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191016-8-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 39b8ce307a4f9bfbcc1d199c5e1bd3342202b284222b120fa52ad4a670ffbbdd
|
GET
H/1.1
|
204
No Content
|
b2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1571559411094&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%...
-
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1571559411094&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
|
0
248 B
|
8ms
6ms
|
Image
text/plain |
23.43.115.95
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1571559411094&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.43.115.95
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a23-43-115-95.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 4158
|
653 B
1 KB
|
68ms
6ms
|
XHR
application/json |
13.224.196.120
Amazon.com
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
36 KB
9 KB
|
372ms
372ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3239548346350458&correlator=643884347116842&output=ldjh&impl=fif&adsid=NT&eid=21064803&vrg=2019101401&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191020&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C468x60%7C728x180%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A20918.default%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26yieldlove_reloaded%3Dfalse%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D14%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26mbrid%3D88f7c511abc193e2d0c384db1731593e%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn127-0%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn133-1%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-2%252Cn154-1%252Cn125-0%252Cn8-3%252Cn2-6%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn139-1%252Cn160-0%252Cn107-1%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-2%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-1%252Cn43-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-0%252Cn148-1&cookie_enabled=1&bc=31&abxe=1&lmt=1571559411&dt=1571559411113&dlt=1571559410338&idt=579&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3040188762&uci=3&ifi=4&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=69&icsg=211657056586498&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=1728711666.1571559411&ga_sid=1571559411&ga_hid=2096249048&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019101401.js?21064803
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 0b618798b7d104a6c3a7cb7e8f71082003bcb3f04072bdf16a57b73f67061776
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
8 KB
4 KB
|
635ms
634ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3239548346350458&correlator=643884347116842&output=ldjh&impl=fif&adsid=NT&eid=21064803&vrg=2019101401&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191020&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A9501.default%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26yieldlove_reloaded%3Dfalse%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D14%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26mbrid%3D88f7c511abc193e2d0c384db1731593e%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn127-0%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn133-1%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-2%252Cn154-1%252Cn125-0%252Cn8-3%252Cn2-6%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn139-1%252Cn160-0%252Cn107-1%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-2%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-1%252Cn43-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-0%252Cn148-1&cookie_enabled=1&bc=31&abxe=1&lmt=1571559411&dt=1571559411118&dlt=1571559410338&idt=579&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3694558186&uci=4&ifi=5&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=69&icsg=211657056586498&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=1728711666.1571559411&ga_sid=1571559411&ga_hid=2096249048&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019101401.js?21064803
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 73b90a493489697f150bf48894a5812d3a5a538695b09d6e1dc7f3391651f625
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
8 KB
4 KB
|
949ms
949ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3239548346350458&correlator=643884347116842&output=ldjh&impl=fif&adsid=NT&eid=21064803&vrg=2019101401&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191020&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A19051.default%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26yieldlove_reloaded%3Dfalse%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D14%26smb-hour%3D10%26yt%3D0%26adset%3Dbrsl%26mbrid%3D88f7c511abc193e2d0c384db1731593e%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn127-0%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn133-1%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-2%252Cn154-1%252Cn125-0%252Cn8-3%252Cn2-6%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-0%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn139-1%252Cn160-0%252Cn107-1%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn49-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-2%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-0%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-1%252Cn43-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-1%252Cn124-1%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-1%252Cn123-1%252Cn17-1%252Cn78-0%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-0%252Cn148-1&cookie_enabled=1&bc=31&abxe=1&lmt=1571559411&dt=1571559411123&dlt=1571559410338&idt=579&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=946476008&uci=5&ifi=6&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=69&icsg=211657056586498&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=1728711666.1571559411&ga_sid=1571559411&ga_hid=2096249048&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019101401.js?21064803
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 6549a81163897393631b6389baf2a5442bd6cd3663a70551fdcbaa0d0f195a5f
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/201910171256/
|
28 KB
11 KB
|
16ms
16ms
|
Script
application/javascript |
151.101.13.194
Fastly
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/201910171256/wrap.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.13.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 51fbe136f28f60bc09b2a92ec09f109e560fb76b14d564e46fbd39cc6020f425
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
0
376 B
|
18ms
18ms
|
Script
text/javascript |
23.37.53.21
Akamai Technologies
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=0&n121=1&n116=0&n104=1&n15=1&n155=1&n133=1&n106=0&n153=0&n11=2&n120=2&n154=1&n125=0&n8=3&n2=6&n137=0&n101=1&n108=1&n54=0&n110=0&n87=0&n149=0&n76=1&n66=1&n139=1&n160=0&n107=1&n21=1&n117=4&n86=0&n147=4&n64=0&n49=1&n119=5&n22=1&n18=1&n161=1&n126=0&n92=2&n77=0&n83=0&n102=1&n105=0&n159=0&n20=1&n80=0&n12=1&n141=0&n157=0&n99=1&n128=1&n118=3&n85=0&n9=3&n6=2&n63=0&n138=0&n140=0&n94=2&n111=0&n136=0&n79=1&n93=4&n90=1&n43=1&n142=0&n7=2&n103=0&n158=1&n124=1&n75=0&n91=1&n46=1&n114=1&n69=0&n10=3&n3=1&n82=1&n84=1&n5=3&n48=1&n109=1&n122=1&n67=0&n115=1&n89=1&n123=1&n17=1&n78=0&n81=1&n88=1&n39=1&n156=0&n148=1
- Requested by
- Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.37.53.21
, Netherlands,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a23-37-53-21.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
9 KB
3 KB
|
26ms
26ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame 4158
|
205 KB
60 KB
|
6ms
6ms
|
XHR
application/javascript |
13.224.196.120
Amazon.com
|
|
|
POST
H/1.1
|
200
OK
|
native
Show response
native.adscale.de/
|
157 B
603 B
|
74ms
54ms
|
XHR
application/json |
95.100.66.110
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 4158
|
205 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 3EB7
|
0
75 B
|
28ms
27ms
|
Fetch
image/gif |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstByQhpnjhxVt8-s8LeITmQnnLbQKkhPYB_XtGyJFprhwy6xH3sRu724_pbbx1s67IPfSfUD-yXNxhzbbHf22ogv660XWxb8vpw58V5_KQ7fBICQOcv5Ho8cn4CZBTd0yv26MI-BU1mk6ZGklpSduzWTvAXRkHzxETFawOUelj26koCCGHABMlNlVyiPV5bRj-lcdSTFy_unyhF-1fVp2bAzfXKzN4WPCi2RDPwGJJT_G7LYzeIXjQK__9bh2szTkH9B-5boUr6WkMAhN7XIRzluA&sig=Cg0ArKJSzNzUfv1QwAM4EAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
video.php
Show response
media.oadts.com/www/delivery/
Frame 3EB7
|
108 KB
108 KB
|
30ms
6ms
|
Script
text/javascript |
185.22.221.117
WAVECON
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 3EB7
|
77 KB
29 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019101401.js?21064803
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame 0428
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuWF5UHxwzHv3CcYw0FR-VWzMG_GfxgMpLhnBN6g44OQYtsYmOhTyT6Th-HYZCh5s7acX0fyzb5mhMbUhjnU7Lo5DJ5GEWNsReYllqn-9aGOWik1VF_hH6zEVDDCPnivEUzWVGa4Gjxg...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
343 B
|
33ms
9ms
|
Image
image/gif |
2a02:26f0:6c00:280::5f76
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
userconnect.js
Show response
js.adscale.de/
|
13 KB
5 KB
|
19ms
6ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
0
Show response
d.nativendo.de/cds/delivery/render/54tmgwlc/182yo/5shds/862o0/
|
4 KB
2 KB
|
12ms
12ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
89a1f4db-cf4b-4fa6-b31b-0a6ae37b9657
Show response
t.nativendo.de/cds/tracking/event/
|
0
171 B
|
30ms
17ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/89a1f4db-cf4b-4fa6-b31b-0a6ae37b9657?aid=182yo&floor=ODlhMWY0ZGItY2Y0Yi00ZmudU05RCZx71uaygw&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1571559411
- Requested by
- Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1174
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
107.178.241.34
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 34.241.178.107.bc.googleusercontent.com
- Software
-
Apache /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
a3784096-b1ba-485f-9c70-fb65c12dfdf6.png
c.nativendo.de/cdn/asset/media/crt/49788/2/3/
|
33 KB
33 KB
|
17ms
17ms
|
Image
image/jpeg |
2606:4700:20::6819:ad0d
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
newui_adpepper_30-09-2019_03285671_1x1_-_kopie_-_kopie_2_.gif
creative-a.akamaihd.net/newui_adpepper/2019-09-30/
Redirect Chain
-
https://ads.creative-serving.com/tr/adpepperc.2/3031548;sz=1x1;cmp=2331054;cr=1040130
-
https://ads.creative-serving.com/tr/adpepperc.2/3031548;sz=1x1;cmp=2331054;cr=1040130;fl_inst=0;ul_cb=1
-
https://creative-a.akamaihd.net/newui_adpepper/2019-09-30/newui_adpepper_30-09-2019_03285671_1x1_-_kopie_-_kopie_2_.gif
|
43 B
315 B
|
25ms
6ms
|
Image
image/gif |
2.16.186.48
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
404
Not Found
|
3031548;sz=1x1;cmp=2331054;cr=10401301571559411
ads.creative-serving.com/tr/adpepperc.2/
|
0
278 B
|
41ms
6ms
|
Image
text/html |
18.195.13.178
Amazon.com
|
|
|
GET
H2
|
200
|
89a1f4db-cf4b-4fa6-b31b-0a6ae37b9657
Show response
t.nativendo.de/cds/tracking/event/
|
0
169 B
|
16ms
15ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
userconnect
Show response
ih.adscale.de/
|
95 B
364 B
|
18ms
17ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 3EB7
|
43 B
400 B
|
5ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 3EB7
|
43 B
400 B
|
11ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 3EB7
|
43 B
400 B
|
17ms
5ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
avc.php
Show response
media.oadts.com/www/delivery/
Frame 3EB7
|
12 KB
12 KB
|
10ms
7ms
|
XHR
application/json |
185.22.221.117
WAVECON
|
|
General
- Full URL
- https://media.oadts.com/www/delivery/avc.php?zoneid=5074&pw=100%25&ph=100%25&msgId=atg8046807584&startmuted=1&cb=0.04715288563748077&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&autostart=1
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- f7cfd7e0bcb4553ee2453c18d53e111712149d2f7be47dd7ac288b951644f056
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 3EB7
|
43 B
400 B
|
16ms
6ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame 80E1
|
0
0
|
66ms
66ms
|
Document
text/html |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
tb
Show response
15.taboola.com/
|
29 KB
30 KB
|
39ms
22ms
|
Script
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&encoded=1&uid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&variant=-100|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1571559411350&tagid=&cntry=DE&platform=1&sesid=2962d9cf99db9c5c365b25ee3d2cfbed&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1571559411077&geolat=&geoing=&deviceifa=&appid=&sd=v2_2962d9cf99db9c5c365b25ee3d2cfbed_918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73_1571559411_1571559411_CNawjgYQrMVBGIWb9sHeLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA&ri=c2029f581675f37f7d3dac9c01da7ac0&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191016-8-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- be71688a2e3159edf8e556194e1c7c16cb009aff48c8f174bf29f9de7f1115b2
|
GET
H2
|
200
|
feed-card-placeholder.20191016-8-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
5 KB
2 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
f89e1763-220d-4e09-ba69-9e040548fb7a.svg
cdn.taboola.com/static/f8/
|
4 KB
2 KB
|
6ms
6ms
|
Image
image/svg+xml |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
userx.20191016-8-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
22 KB
8 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
204
|
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/
Frame 3CF1
Redirect Chain
-
https://rtb.mfadsrvr.com/sync?ssp=taboola
-
https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
-
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=8a9d0a61-af93-4872-ad17-72324f72251d
|
0
49 B
|
14ms
14ms
|
Image
text/plain |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=8a9d0a61-af93-4872-ad17-72324f72251d
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
204
No Content
|
sync.php
pixel.rubiconproject.com/exchange/
Frame 3CF1
|
0
239 B
|
33ms
9ms
|
Image
image/gif |
69.173.144.165
The Rubicon Project
|
|
General
- Full URL
- https://pixel.rubiconproject.com/exchange/sync.php?p=16698
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_256_GCM
- Server
-
69.173.144.165
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/
Frame 3CF1
Redirect Chain
-
https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D
-
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=NhVQdlTUIUmXAENOuwluYSXco8sr7MR-p1Mb4LWIV2w%3D
|
45 B
103 B
|
16ms
16ms
|
Image
image/gif |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=NhVQdlTUIUmXAENOuwluYSXco8sr7MR-p1Mb4LWIV2w%3D
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/mediamath-ssp-network/1/
Frame 3CF1
Redirect Chain
-
https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]
-
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=6b5d5dac-1738-4900-8dfb-2c8a4991a705
-
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=6b5d5dac-1738-4900-8dfb-2c8a4991a705&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3D6b5d5dac-1738-490...
|
0
52 B
|
15ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=6b5d5dac-1738-4900-8dfb-2c8a4991a705&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3D6b5d5dac-1738-4900-8dfb-2c8a4991a705
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/appnexus-network/1/
Frame 3CF1
Redirect Chain
-
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID
-
https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=7658547193960028166
-
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=7658547193960028166&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3D7658547193960028166
|
0
52 B
|
14ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=7658547193960028166&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3D7658547193960028166
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/google-network/1/
Frame 3CF1
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc
-
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEIIiaK8fzvJs0Ylht8OYYeI&google_cver=1
-
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEIIiaK8fzvJs0Ylht8OYYeI&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3DCAESEIIiaK8fzvJs0Ylht8OYYeI%26goo...
|
0
52 B
|
16ms
15ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEIIiaK8fzvJs0Ylht8OYYeI&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3DCAESEIIiaK8fzvJs0Ylht8OYYeI%26google_cver%3D1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
/
trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/
Frame 3CF1
Redirect Chain
-
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID
-
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=7658547193960028166
|
0
49 B
|
14ms
14ms
|
Image
text/plain |
151.101.114.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=7658547193960028166
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/thetradedesk-network/1/
Frame 3CF1
Redirect Chain
-
https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1
-
https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1
-
https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=ac478aa4-31ff-42c8-b212-246d8378ba93
-
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=ac478aa4-31ff-42c8-b212-246d8378ba93&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3Dac478aa4-31ff-42c8...
|
0
52 B
|
15ms
15ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=ac478aa4-31ff-42c8-b212-246d8378ba93&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3Dac478aa4-31ff-42c8-b212-246d8378ba93
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/storygize-network/1/
Frame 3CF1
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=f6884e2c-1f42-4e27-8a49-8416b0a119cb
-
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=f6884e2c-1f42-4e27-8a49-8416b0a119cb&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3Df6884e2c-1f42-4e27-8a...
|
0
76 B
|
15ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=f6884e2c-1f42-4e27-8a49-8416b0a119cb&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3Df6884e2c-1f42-4e27-8a49-8416b0a119cb
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
cookiesync
bttrack.com/pixel/
Frame 3CF1
|
35 B
380 B
|
386ms
98ms
|
Image
image/gif |
192.132.33.46
Bidtellect Inc.
|
|
|
GET
H/1.1
|
200
OK
|
/
cds.taboola.com/
Frame 3CF1
|
0
293 B
|
305ms
116ms
|
Image
text/plain |
130.211.13.252
Google LLC
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/bidswitch-network/1/
Frame 3CF1
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://ads.creative-serving.com/bsw_sync?bidswitch_ssp_id=taboola&bsw_custom_parameter=7fe96fd0-7d6b-4c40-be88-0de4006e16e3
-
https://x.bidswitch.net/sync?dsp_id=4&user_id=d8084f1b-8fcd-4d05-82ae-4283a9f26fb7&ssp=taboola&expires=30&user_group=5&bsw_param=7fe96fd0-7d6b-4c40-be88-0de4006e16e3
-
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=7fe96fd0-7d6b-4c40-be88-0de4006e16e3
-
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=7fe96fd0-7d6b-4c40-be88-0de4006e16e3&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3D7fe96fd0-7d6b-4c40-be...
|
0
52 B
|
14ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=7fe96fd0-7d6b-4c40-be88-0de4006e16e3&tbid=918a6884-7ed7-402e-9751-e55bbb568bc8-tuct4a59d73&query=taboola_hm%3D7fe96fd0-7d6b-4c40-be88-0de4006e16e3
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
93 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=2096249048&t=event&ni=1&_s=12&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=1728711666.1571559411&tid=UA-204785-4&_gid=2003541418.1571559411&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cm73=1&cm13=1&z=218264575
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
1x1_pixel.png
s0.2mdn.net/9523403/
Frame 5D6E
Redirect Chain
-
https://ad.doubleclick.net/ddm/ad/N1155082.3001245TABOOLADE/B22999630.252657784;sz=1x1;ord=[1];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
-
https://ad.doubleclick.net/ddm/ad/N1155082.3001245TABOOLADE/B22999630.252657784;dc_pre=CKvo2IOzquUCFVtx4Aody_8NYQ;sz=1x1;ord=[1];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
-
https://s0.2mdn.net/9523403/1x1_pixel.png
|
68 B
356 B
|
32ms
12ms
|
Image
image/png |
2a00:1450:4001:818::2006
Google LLC
|
|
General
- Full URL
- https://s0.2mdn.net/9523403/1x1_pixel.png
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2006
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 93ae7d494fad0fb30cbf3ae746a39c4bc7a0f8bbf87fbb587a3f3c01f3c5ce20
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame 3EB7
|
1 KB
1 KB
|
125ms
29ms
|
XHR
text/xml |
62.168.44.126
GTSCE GTS Central...
|
|
General
- Full URL
- https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=27d221c81d&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.126
Prague, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- bbnaut2.bbelements.com
- Software
-
ibillboard /
- Resource Hash
- f1d0d2bb758e8748068277fc3606997a59b8b8aa81c3ddebcc542ce555c0e4b7
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame 3EB7
|
43 B
307 B
|
10ms
9ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
General
- Full URL
- https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=23481&eventId=21&plr=3&cb=0.20819912538282992&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dur=0
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- 4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
98 B
|
14ms
14ms
|
XHR
image/gif |
151.101.114.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
54 B
|
15ms
15ms
|
XHR
image/gif |
151.101.114.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
55 B
|
16ms
16ms
|
XHR
image/gif |
151.101.114.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
55 B
|
18ms
18ms
|
XHR
image/gif |
151.101.114.2
Fastly
|
|
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
655 B
|
7ms
7ms
|
Image
image/png |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
- Requested by
- Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
|
GET
H2
|
200
|
creative_js.js
Show response
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
|
4 KB
2 KB
|
7ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
st
imprammp.taboola.com/
Frame 278F
|
0
0
|
16ms
14ms
|
Document
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=83B12AE6B8194705408189086333&cicmp=1657475&cijs=1&dast=V75qoCFgOO_YdP4KmPWQSO_YdP4KmPWQUAAAAGBvQHHLiZMCYLFm1CXCxHu8FqNNjtdpPZZjcbrqYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ9Q-_WTE__YiRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDQht7jyJqlOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugIWjEYrM4gJpvRbjI7AAAAgLv___9_PRBZziYj58bmXI4szo1r45mtJpbVyuUZWTY2i8vkPU-8-1khsm-fvhFhmf2-g4JyenrMLoOM5TIZ1AJZ0-TyG8QHDcNyMgjmN2GL0Woy2SyHs-ViMhiOhqPR_gRuNMAJGg4Hi91gsVsshpPFZDRYDhYoEIMJTshwtJmsRrvVbrIcTkaj2WayQYpWrWajzWC4mk1mu91qOBguRyOkaM1iNpksZqPlbjNYTkaD4WQ4RJhcDBe24XC01q1MvrVoMFm5lbvVYq1yrSYWi2s2nHiMa9HrYzotXMuRb7NFwQClvQgu0onmdPm7XJa35m1x65w-h0Us0Zws0onssq8sZ5ORc2NzLkcW58a18cxWE8tq5fKMLBubxWXyNxfDhW04HK11K5NvLRpMVm7lbrVYq1yricXimg0nHuNa9PqYTgvXcuTb7Bur3WK1Wo4Wi31jtVusVsvRYrHv0Bm-q8_ZqLxpFR6TV3Fujiwzp0HhMli8P4lpMe3ODp7f7-hUqS4aY0P2TSjMBo_BoIglgtNFOhG9jKeLWCJ5WqQTjWUwWc5cw8Vst5p5djPfyDNyeJwbw2Lk8C08holYojRdpBO97mVxGA6fv-DhPDzMftHTcPj8BQ_n4WF2i_0-p92t-bt1LqPp81bdTW7N3y32uzynt9JoeYv9PqfdLbj8LWaX22VR_7EhRqO5bjZXDJZzzWCVAAAAAAAAAACWMGfeBAAAAOA0kMViMFksFwBCjHWX4FMq5NEJ_K248WOIOV3-LpflrXlb3Dqnz2FlAImdAg!&excid=22&tst=1&docw=0&cs=false
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H2
|
200
|
cmTagFEED_MANAGER.js
Show response
vidstat.taboola.com/vpaid/units/23_14_12/infra/
|
766 KB
180 KB
|
7ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
cmOsUnit.css
vidstat.taboola.com/vpaid/units/23_14_12/assets/css/
|
34 KB
6 KB
|
6ms
6ms
|
Stylesheet
text/css |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 21CC
|
0
57 B
|
28ms
28ms
|
Fetch
image/gif |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssgRWZy72TfsXWUKXvr-Kq2Gp60Xu7GoliZ0n18GZ65eYkLFF-dnPF0FzXC-jw8LwFM0Z7Aq7bRep3kECOHT9XYLGcVjjgGXsuqM9NN4YEbiUuNktGqZrNk3f1oBX36bI74gKvykbB_TRux6iGeurtODXq787wpljDN-YOvdp8aTJVbrBAMWyGUAgBAdmHLzBi0l00k8BgB23LVlWh9xJLO7cFaEKk6t0d1QGA2SEy85nIDJLonFzmarA8UIIE8a5l45BG-sd-617N8GR3Mye4U9PeKC04awqXgRjKl4LtT&sig=Cg0ArKJSzM-PG-hlAefwEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sDm_BB_Pos.js
Show response
cdn.stroeerdigitalmedia.de/Ads/script/
Frame 21CC
|
41 KB
8 KB
|
32ms
32ms
|
Script
application/x-javascript |
2a02:26f0:6c00:280::5f76
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
dcmads.js
Show response
fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754026/dcm/
Frame 21CC
|
197 KB
67 KB
|
82ms
52ms
|
Script
application/javascript |
199.166.0.24
Integral Ad Science
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 21CC
|
77 KB
29 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019101401.js?21064803
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
vast
Show response
tracking.m6r.eu/sync/
Frame 3EB7
|
490 B
926 B
|
20ms
20ms
|
XHR
text/xml |
23.37.53.21
Akamai Technologies
|
|
General
- Full URL
- https://tracking.m6r.eu/sync/vast?checkcookies=true&ibbId=&slotId=346a3f1b-2167-4e54-8af3-4a8d2910a189&target=https%3A%2F%2Fvideo-adserver.ibillboard.com%2FgetAd%3Ftagid%3D346a3f1b-2167-4e54-8af3-4a8d2910a189%26bust%3D27d221c81d%26ref%3Dhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F%26ngresponse%3Dtrue%26nu%3D%24%24DMP_SEGMENTS_NUGGAD%24%24%26impid%3D8abf2003-0286-48d5-bb9e-3722faf37486
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.37.53.21
, Netherlands,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a23-37-53-21.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- e5b776bc2b86f6cc00f3b48b302d94b796e8221bc46974702ee7db62099be148
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame 3EB7
|
48 B
556 B
|
121ms
121ms
|
XHR
text/xml |
62.168.44.126
GTSCE GTS Central...
|
|
General
- Full URL
- https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=27d221c81d&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ngresponse=true&nu=n4%3D2%26n3%3D1&impid=8abf2003-0286-48d5-bb9e-3722faf37486
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.126
Prague, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- bbnaut2.bbelements.com
- Software
-
ibillboard /
- Resource Hash
- c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
|
GET
H2
|
200
|
89a1f4db-cf4b-4fa6-b31b-0a6ae37b9657
Show response
t.nativendo.de/cds/tracking/event/
|
0
169 B
|
15ms
15ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
skeleton.js
Show response
static.adsafeprotected.com/
Frame 21CC
Redirect Chain
-
https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754026/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-l...
-
https://static.adsafeprotected.com/skeleton.js
|
17 B
299 B
|
37ms
23ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H/1.1
|
200
OK
|
sca.17.4.95.js
Show response
static.adsafeprotected.com/
Frame AB44
|
81 KB
20 KB
|
82ms
36ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
308 B
|
419ms
142ms
|
Image
image/gif |
104.244.37.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=e71f43df-b5db-e2c1-5115-cd2e2be34d22&tv={c:rzDFgh,pingTime:-2,time:34,type:a,im:{sf:0,pom:1,prf:{mdA:3,mdZ:98,beA:101,beZ:102,mfA:104,cmA:105,inA:105,inZ:109,prA:109,prZ:116,si:121,poA:122,poZ:127,cmZ:127,mfZ:127,loA:132,loZ:133,ltA:135,ltZ:135}},sca:{dfp:{df:4,sz:800.250,dom:ins}},env:{gca:0},clog:[{piv:100,vs:i,r:,w:800,h:250,t:19}],es:0,sc:1,ha:1,gm:0,slTimes:{i:35,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:19,wc:0.0.1600.1200,ac:393.121.800.250,am:i,cc:393.121.800.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[30~100],as:[30~800.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rFqv8h5+11|12|1311|1312|1313|1314|14|151|1611|17|18|19|1a|1b|1c|1d|1e|1f|1g|1h|1i*.346702-39754026,idMap:1i*,rend:0,renddet:WINDOW,rmeas:0,slid:[google_ads_iframe_4444/giga.de_sd/software_artikel_2,google_ads_iframe_4444/giga.de_sd/software_artikel_2__container__,sdgAdServerContainer-banner,banner-1],sinceFw:14,readyFired:true}&br=u
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.37.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- daldt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
oIQ
tracker-adserver.ibillboard.com/error/impid/8abf2003-0286-48d5-bb9e-3722faf37486/iid/bd5ec01c-f2e1-4856-9d04-615928d9e363/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2...
Frame 3EB7
|
0
272 B
|
126ms
24ms
|
Image
text/plain |
62.168.44.126
GTSCE GTS Central...
|
|
General
- Full URL
- https://tracker-adserver.ibillboard.com/error/impid/8abf2003-0286-48d5-bb9e-3722faf37486/iid/bd5ec01c-f2e1-4856-9d04-615928d9e363/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/oIQ?erc=303
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.126
Prague, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- bbnaut2.bbelements.com
- Software
-
ibillboard /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
tag
Show response
a.teads.tv/page/68592/
Frame 3EB7
|
1 KB
827 B
|
23ms
9ms
|
Script
application/javascript |
2.21.37.179
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
teads-format.min.js
Show response
a.teads.tv/media/format/v3/
|
708 KB
184 KB
|
6ms
6ms
|
Script
text/javascript |
2.21.37.179
AKAMAI-ASN1
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 21CC
|
210 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb33.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb33.s400.meetrics.net/data?/bHXvD0OAAKktFLkqFFlqwF23A52AwwA/k0FMEmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Ax1A15A0xAxzA54ALlnFBUkzF2BPbKAAAAAAABcufAPBAAFAAcufTA5iAPAAAAAAkaABA5iAZAAAOA55A55A85B55A58E55A55AGAxyA55A04ArA5iAPFAAAAAkaAPA5iAPBAAAAAkaAIA5iASksFbFjAAAAAAAAAAAAEAAAcufAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0tBvmFtwEhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlBFdAAAkaAAAAAAAFAAAA5iAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFIPNPUA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame CF90
|
0
0
|
38ms
6ms
|
Document
text/html |
2a02:26f0:6c00:292::2c92
AKAMAI-ASN1
|
|
General
- Full URL
- https://cmp.teads.mgr.consensu.org/index.html
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:292::2c92
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame B32A
|
0
0
|
28ms
6ms
|
Document
text/html |
2a02:26f0:6c00:292::2c92
AKAMAI-ASN1
|
|
General
- Full URL
- https://cmp.teads.mgr.consensu.org/index.html
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a02:26f0:6c00:292::2c92
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
p
sb.scorecardresearch.com/
|
43 B
309 B
|
8ms
6ms
|
Image
image/gif |
23.43.115.95
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1571559411744&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=14035171&cs_ucfr=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.43.115.95
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a23-43-115-95.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
55ms
29ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
56ms
30ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
p
sb.scorecardresearch.com/
|
43 B
309 B
|
14ms
6ms
|
Image
image/gif |
23.43.115.95
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1571559411758&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=72634927&cs_ucfr=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.43.115.95
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a23-43-115-95.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
57ms
31ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
59ms
33ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 67BD
|
0
57 B
|
30ms
28ms
|
Fetch
image/gif |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsseIK1T5w9Hzd09-p7cTpoCbLA3blmi3dlWxgmGSz8JFygEH57Z4gVkdA25bZOsH-RN1t6udxnS2I9VR6ZNJITDxWF-om2JoCtZLjYlqt2j38h5AQ7IokhZmiFhEU0Mg8rTxNTnLZssGHGZku6vYjnnx15h32Om6lNHn5-gol9SUTRo9FoIL0UPB7LBx_U9zK2aaKThZneBmbTZFi98YbIf8dU1BnNmUSnU5jNfMnZQQg8IN56YETx4S3nkmdexAIK-Sw_H-2n8adCFsWeFxeTqroKXh_GMcufWdBi6&sig=Cg0ArKJSzJduJT0ZRmi9EAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
dcmads.js
Show response
www.googletagservices.com/dcm/
Frame 67BD
|
4 KB
2 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/dcm/dcmads.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019101401.js?21064803
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 109c5ca0835be804008bf2258c34d8139044f34f56fbfa98da2cc3bffdbb0b5d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 67BD
|
77 KB
29 KB
|
22ms
21ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019101401.js?21064803
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame 4158
|
53 B
642 B
|
11ms
10ms
|
XHR
application/json |
52.219.74.155
Amazon.com
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=9882267333
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEt1dGFlY2hlZGllUG9ZYWk9S3V0YWVjaGVkaWVQb1lhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5TbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5rdShtKTthLmp1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5zdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3I9dGhpcy5hWzddO3RoaXMub2o9dGhpcy5hWzNdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuSGo9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzddO3RoaXMuRGw9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzEwXTt0aGlzLkJwPXRoaXMuYVszXTt0aGlzLlJqPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMucHM9YjtiLnByb3RvdHlwZT17VnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53djp0aGlzLkdqKGEpfSwKR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkhqOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Objp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnA6dGhpcy5DbChhKX0sQ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRsOnRoaXMubnMoYSl9LG5zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5vczp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnA6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5wc3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuVnIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuU289CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk9jPVtdO3RoaXMub2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5DdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuU2c9e307dGhpcy5lZj0hMX1jLm1rPWI7Yi5wcm90b3R5cGU9e1B1OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWmI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5TZ1thXSYmKHRoaXMuU2dbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5QdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxhbzpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sQ3Q6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuQnQoYS5kYXRhKX0sQnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0saGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0scGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5IZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMua2goYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEhnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxabjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUubXEoYSkpcmV0dXJuOyhiPXRoaXMucGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxtcTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LElyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHllOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sR2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG9mOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxHZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LEVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwkaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwkcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxMbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx5bjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmNsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxDbzpmdW5jdGlvbigpe3JldHVybiBhLkppKCl8fGEuJGkoKXx8YS4kcSgpfHxhLkxsKCl8fGEueW4oKXx8YS5jbCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5DbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LCRiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LEdxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx5cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxIdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxDZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuZGkoYikrIjoiK3RoaXMuZGkoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxnZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHpnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5lZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LENjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy56ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkNjKEIpfSxFdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkdxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sSXU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlpiKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5lZShhKX0sZWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uS2MoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLktjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LE1kOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uS2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTWU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uYnAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSw1MDApfSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5IZShhKXx8dGhpcy5JcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmRmJiZ3aW5kb3cuc2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnhnKGEpKXJldHVybiB0aGlzLnhnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5abihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LGpzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmtoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGxoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5qcyhmLnNkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuT2M9YX0saXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEhvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5ta3x8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMubGs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi50dD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Hcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmJxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ZZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5RZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlZmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlpmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Sbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5UZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5jcT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmZkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuemM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlhmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Ubj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlhjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5hZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5jZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuU249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmtpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuSXM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi52ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5jdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuSHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmxrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp0PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbNV07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy5HdT10aGlzLmFbNF07dGhpcy5McD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLllsPWI7Yi5wcm90b3R5cGU9e3l0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56dDp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVzOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zazp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdvOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HdTp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTHA6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5ZbHx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMueXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5uaz1iO2IucHJvdG90eXBlPXtBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCsKbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxCcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxuZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubmQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5uZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPQphLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxrYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMubGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sdHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkJxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubmQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMubmt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmhsPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs3XTt0aGlzLnF3PXRoaXMuYVs5XTt0aGlzLkN1PXRoaXMuYVs0XTt0aGlzLkF1PXRoaXMuYVsxMF07dGhpcy5pdD10aGlzLmFbNl07dGhpcy5mdz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs2XX1jLnByPWI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5obDp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXI6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF3OnRoaXMuQnUoYSl9LEJ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5DdTp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQXU6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml0OnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLnByfHxrYSx3Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5nbCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PQp0eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MubGo9Yn0pKGMpO3ZhciBMPWMubGp8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnY9dGhpcy5hWzJdO3RoaXMudnM9dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMV19Yy4kcD1iO2IucHJvdG90eXBlPXtxdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnY6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ocjp0aGlzLlZtKGEpfSwKVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLldtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy4kcHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMucXYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5lbT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5sdShiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLAp0aGlzLkxjKSl9LGF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0senE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0uT3UoYil9LGZ4OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxEcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHh4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09Cm51bGx9fSl9KShjKTt2YXIgdD1jLmVtfHx0OyhmdW5jdGlvbihjKXtjLmdtPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSx2dTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxvdTpmdW5jdGlvbihiKXt0aGlzLlBlPQpifSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSwKRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSx6eDpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5TcSgpfHx0aGlzLlZuKCk7dGhpcy5EZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LFZuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJgpiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LGp4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSx1eDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYXg6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZ218fHA7KGZ1bmN0aW9uKGMpe2Mud2k9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy5Jbj0iMyI7dGhpcy5UYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdOwp0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5tdShhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHNyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldPwp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnNyKCk7aWYoIXRoaXMuQXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksCnRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sCnc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LHR1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Jbn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sUnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlRjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LG11OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx6cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LG1zOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy53aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUW49dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzZdO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMudms9YjtiLnByb3RvdHlwZT17UG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFuOnRoaXMuQ3AoYSl9LENwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EcDp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy52a3x8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuUG4oNCk7KGZ1bmN0aW9uKGMpe2MuVmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuVmp8fG9hOyhmdW5jdGlvbihjKXtjLldqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5TdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0KITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgcGE9Yy5Xanx8cGE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuWGp8fHFhOyhuZXcgcWEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UcD10aGlzLmFbOF07dGhpcy5UaT10aGlzLmFbMl07dGhpcy5Mbj10aGlzLmFbMl07dGhpcy5ubT10aGlzLmFbNF07dGhpcy55bz0KdGhpcy5hWzVdO3RoaXMuUXI9dGhpcy5hWzddO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuTm89dGhpcy5hWzVdO3RoaXMuTmw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5odj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHA6dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRpOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5tOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueW86dGhpcy5QcihhKX0sUHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFyOnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sdzp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5NbyhhKX0sCk1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmh2fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5TcCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3RoaXMud2coKTt0aGlzLnlnKCk7dGhpcy5wcD0hMX0sd2c6ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5jYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj0KYi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuY2M9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmCnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiYKYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sCnVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Pa3x8c2E7KGZ1bmN0aW9uKGMpe2MuTms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmCihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5WYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJgpiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS55ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuVmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5vaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLldjLmluZGV4T2YoYSkmJgp0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5XYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sbXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2Uub2YoYS52aWRlb1RhZyk/YS5jYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlZjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Oa3x8dGE7KGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy53cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkRyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCndxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Qa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLm9xPXRoaXMuYVszXTt0aGlzLm93PXRoaXMuYVszXTt0aGlzLmxwPXRoaXMuYVs3XTt0aGlzLnl2PXRoaXMuYVs4XTt0aGlzLkpwPXRoaXMuYVszXTt0aGlzLnRvPXRoaXMuYVsyXTt0aGlzLlltPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLiRrPWI7Yi5wcm90b3R5cGU9e0VsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GbDp0aGlzLm5xKGEpfSxucTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3E6dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm93OnRoaXMua3AoYSl9LAprcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHA6dGhpcy54dihhKX0seHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnl2OnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcDp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG86dGhpcy5YbShhKX0sWG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlltOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy4ka3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MubW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZmk9ITA7dGhpcy51Yz10aGlzLldnPSExO3RoaXMuRXMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnJoKCksdGhpcy5ZbygpLHRoaXMucmIoKSl9LEVzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LHZ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwKIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT8KYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwKIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5pZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sClliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxKZzpmdW5jdGlvbigpe2lmKCF0aGlzLkZjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LEJyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuenIoKTt3aW5kb3cuaW1hJiZiJiYKKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LHpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy4kYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuJGM9ITApO3JldHVybiB0aGlzLiRjfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWWIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5UdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsCiEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxUdDpmdW5jdGlvbigpe3RoaXMudWM9ITA7dmFyIGI9dGhpcy5KZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIiwKZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5vZyYmYi5hZHMmJih0aGlzLm9nPWIuYWRzKTtyZXR1cm4gdGhpcy5vZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpOwp0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5CcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlliKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlliKCksdGhpcy51Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOgoodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5abygpfS5iaW5kKHRoaXMpLAoxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxncDpmdW5jdGlvbigpe3RoaXMua3h8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSwKd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlF2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuJHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sJHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5sbnx8eWE7KGZ1bmN0aW9uKGMpe2Mubm49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTsKdmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbT10aGlzLmFbMV07dGhpcy5Qaj10aGlzLmFbMTBdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMuUnA9dGhpcy5hWzJdO3RoaXMuSHA9dGhpcy5hWzJdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMubm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5Daj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY206dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBqOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdjp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnA6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMueHcoYSl9LAp4dzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXc6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5Danx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuYm0oNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTsKcmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sdXQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueWQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCkFhOmZ1bmN0aW9uKCl7dGhpcy5WZSsrO2lmKDEwPHRoaXMuVmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBDYT1jLlJsfHxDYTsoZnVuY3Rpb24oYyl7Yy5RbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9CiEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7CnZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuZnE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLmZxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IudXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBEYT1jLlFsfHxEYTsoZnVuY3Rpb24oYyl7Yy5TbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYKKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlNsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG89dGhpcy5hWzddO3RoaXMuTGk9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzldO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuVXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Lcj1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5MaTp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucm86dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JaTp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLktyfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5Pbyg0KTsoZnVuY3Rpb24oYyl7Yy5Maz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5HZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmCihhPWEucGFyZW50Tm9kZSl9dGhpcy5BdD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQXQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7CnRoaXMubGQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5sZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZwOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmxkKTtlLkZlKHRoaXMubGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuTGt8fEhhOyhmdW5jdGlvbihjKXtjLktrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5HKCEwKX19KX0pKGMpO3ZhciBJYT1jLktrfHxJYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBiPQpsLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5Na3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5qPXRoaXMuYVs0XTt0aGlzLkpvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuVmw9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSm86dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5WbHx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuTWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLm9rPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG51OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sV246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5va3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsCmQsZil7dGhpcy4kYT1hO3RoaXMuQmc9dGhpcy5vaT0hMTt0aGlzLnNoPWQ7dGhpcy5TaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeihhKSk7dmFyIGM9dGhpcy5nYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5JZSh0aGlzLiRhLnVybCkmJm0uT2Qpe3ZhciBlPW5ldyB6KGEudXJsKTtlLm51KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMucGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQmcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuZ2IudXJsQ2FsbGVkPXRoaXMuJGEudXJsO3RyeXt0aGlzLlNoP3RoaXMuZ2Iub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLm9pfHwodGhpcy5nYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJgp0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmdiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5JZSh0aGlzLiRhLnVybCk/bS5PZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkllKHRoaXMuJGEudXJsKSx0aGlzLnNoJiZ0aGlzLnNoKCl9cmV0dXJuIHRoaXMuZ2J9fX0pKGMpO3ZhciBNYT1jLnBrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5XZD0hMX1jLm1qPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3RoaXMuV2Q9YX0scXU6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtCdzoiQWRDbGlja1RocnUiLER3OiJBZEVycm9yIixFdzoiQWRTdG9wcGVkIixIdzoiQWRMaW5lYXJDaGFuZ2UiLEl3OiJBZFRhZ1BhcnNlZCIsTHc6IkFkVmlkZW9Db21wbGV0ZSIsT3c6IkFkTG9hZGVkIixQdzoiQWRTa2lwcGVkIixRdzoiQWRTdGFydGVkIixGdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEd3OiJBZEltcHJlc3Npb24iLEN3OiJBZENyZWF0aXZlVmlldyIsSnc6IkFkVmlkZW9NaWRwb2ludCIsS3c6IkFkUGF1c2VkIixNdzoiQWRWaWRlb1N0YXJ0IixOdzoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmEodGhpcy5XZCxiW2RdKX0sWHQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlZkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlZkKXRoaXMuSGEuVmQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlZkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldkJiZ0aGlzLll0KCk7dGhpcy5IYSYmdGhpcy5YdCgpfX19KShjKTt2YXIgTmE9Yy5tanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPQohMTt0aGlzLnhjPSIiO3RoaXMuamU9dGhpcy53Yz10aGlzLndiPW51bGw7dGhpcy56cD10aGlzLkpiPXRoaXMuamg9ITE7dGhpcy5MYT0iIjt0aGlzLmVoPSExO3RoaXMud2E9dGhpcy5xZD0iIjt0aGlzLiRnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLmFmPSExO3RoaXMucGE9W107dGhpcy5QZz10aGlzLmdjPSIiO3RoaXMucmU9ITE7dGhpcy5zZj0wO3RoaXMuSGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMub2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmljPSIiO3RoaXMuamM9W107dGhpcy5rYz1bXTt0aGlzLktkPVtdO3RoaXMuaGM9IiI7dGhpcy50Zj0KMDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5FYz0hMTt0aGlzLmhwPXRoaXMuUWQ9bnVsbDt0aGlzLk5oPXRoaXMubWM9dGhpcy50Zz10aGlzLndmPXRoaXMuT2Q9dGhpcy5sZT10aGlzLlVjPSExO3RoaXMuaWI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucmQ9MDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuYmQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5QZj0iIn1jLnFrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMueGMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy53YyxhZHRhZ3JlZ2V4OnRoaXMuamUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuamgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuenAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCwKY2xpZW50Q29uZmlnOnRoaXMud2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLiRnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmdjLGhvbWFkQWRwYXRoOnRoaXMuUGcsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5yZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5zZixIT01BRF9WRVJJRklFRDp0aGlzLkhmLEhPTUFEX0JMT0NLRUQ6dGhpcy5GZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5vYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuR2YsdGVzdEhpZGU6dGhpcy5pYyx0ZXN0VGFnczp0aGlzLmpjLHRlc3RUYWdzSlM6dGhpcy5rYyx0ZXN0VGFnc1hIUjp0aGlzLktkLHRlc3RDb29raWU6dGhpcy5oYyx0aHJvdHRsZTp0aGlzLnRmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlVjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMubGUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuT2QsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMud2YsY29uZmlnRmFpbHVyZXM6dGhpcy5pYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5LaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMua2IsdnBhaWQ6dGhpcy5tYyxza2lwQWxsb3dlZDp0aGlzLk5oLHZtYXBzOnRoaXMubGksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLmJkLGFkRmFsbGJhY2tVUkw6dGhpcy5QZn19LFFxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmliKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaWJbYl0mJjE9PXRoaXMuaWJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5IbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkhlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkdjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5LYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnhjfHx0aGlzLndifHx0aGlzLndjfHx0aGlzLmplKSYmKGc9dGhpcy54cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnlxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5HYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sR2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuSGUoYSk7cmV0dXJuIGJ9LHlxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5YdztyZXR1cm4ibm9uZSJ9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5LaF19LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZCgpLGI9dGhpcy5NaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxwaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx3czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5waChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMucGgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx4czpmdW5jdGlvbihhKXt0aGlzLnhjJiYoYSs9dGhpcy54Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMud2MmJihhPXRoaXMud3MoYSx0aGlzLndjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi5ydShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIucXUoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZWg9ITA7dGhpcy5xZD1hO3RoaXMud2E9Yjt0aGlzLmFmPWQ7dGhpcy5RZD1mO3RoaXMuQmM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmhzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuZnMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueWMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLnFkK3RoaXMuZ2UoImdsb2JhbCIpKSx0aGlzLk1xLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LGZzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZ2UoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy55Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGdlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmxlKXt0aGlzLmxlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkJjPSExKTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuJGc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkZmKSk7dGhpcy5OYigpO2UuQ2Moay50dCk7KGI9ZS4kYih0aGlzLnNkKCkpKXx8KGI9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sTXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmdjfHx0aGlzLkxhfHx0aGlzLnljKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHljOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuR2MoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmdjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuUGc9YS5hZHBhdGh8fCIiO3RoaXMucmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5LaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkhjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxIYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLktjKCkpLGQ9dGhpcy56YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMuZ2UoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlJ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjdXN0b21lciIpO2E/dGhpcy55bT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLnltPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5IYyghMCl9LmJpbmQodGhpcyksITApfX0sUnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5FYz0hMDt0aGlzLkhjKCEwKTtyZXR1cm59fXRoaXMuT2Q9dGhpcy5NYihiLnN0cmljdCk7dGhpcy53Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5rYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5LZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy53Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuamU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuamg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubWM7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmNkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5saT1iLnZtYXBzfHwiIjt0aGlzLmJkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5QZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkZxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5yZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy50Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5FYz0hMCx0aGlzLkhjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLktkKT90aGlzLmFmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMubmUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmtkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFBjOmZ1bmN0aW9uKGEpe3RoaXMuVWM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKGEpKSx0aGlzLk5iKCksdGhpcy5uZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmljKXt2YXIgYT1lLmtkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5paCgpKXRoaXMuUGModGhpcy5vYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuV2goKX19ZWxzZSB0aGlzLldoKCl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5wZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuS2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBmKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxXaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVmguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVmgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxwZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMuc2YrKyx0aGlzLkRhKG5ldyB6KHRoaXMuaGMpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMucWYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5UaCgpfSxxZjpmdW5jdGlvbihhKXt0aGlzLlBjKHRoaXMuR2YsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5zZj90aGlzLnBmKCk6dGhpcy5xZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlRoKCk6dGhpcy5xZigiQUFBIil9LFRoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubmUoKX0saWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlVjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmloKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5IZikpO3RoaXMuUWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5RZCYmdGhpcy5RZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMud2YmJnRoaXMuUXEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sJGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEub2k9ITApO3EmJmUuRXIoKSYmKGEuQmc9ITApO2cmJihhLlNoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmJiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5HYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sVXU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmxpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLkl2LmJpbmQodGhpcyksdGhpcy5Idi5iaW5kKHRoaXMpKX0sSXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LEh2OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkNjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG5lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmJiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sa3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sRnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5xa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLmpsPXRoaXMuYVs4XTt0aGlzLk9yPXRoaXMuYVs3XTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLk5wPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuYXE9YjtiLnByb3RvdHlwZT17d2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9yOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXI6dGhpcy5NcChhKX0sTXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5wOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7CnZhciBQYT1jLmFxfHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy53ayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWWcmJmEuZi5ZZyh7cGF1c2U6dGhpcy55ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMudXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLldiPXRoaXMuYWQ9ITE7dGhpcy5Cbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlJvPWUuYWEoMTApOwp0aGlzLm1mPTA7dGhpcy5aYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlpjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLlpjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudGg9dGhpcy5HZD0hMTt0aGlzLm1oPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYmM9ITE7dGhpcy5ycD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SZD0KdGhpcy5PYj10aGlzLnBlPXRoaXMuZ2Q9dGhpcy5JZD10aGlzLnNiPXRoaXMubmM9dGhpcy52aD10aGlzLm1kPXRoaXMubHY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMuc2M9W107dGhpcy5kYz17fTt0aGlzLmp0PTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy54ZD17fX1jLmtrPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5LdSgpO2UudihrLlRuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9CmM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuY3AoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubWgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLkxlKGEsYixjKX0sNTApfX0sV2U6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5tZD0hMTt0aGlzLmM9YTt0aGlzLnd1KHRoaXMuYyk7dGhpcy54ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTWcoYSk7dGhpcy5zYz10aGlzLkRnKGEpO3RoaXMubXAoKX0sTWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSGQ9dGhpcy5JcShhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkRnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuc3EoYSkpKTtyZXR1cm4gY30sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LElxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuamQmJmEuamQuZXJyb3ImJmEuamQuZXJyb3IuY29kZSYmCihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUcuWGQuY29kZT9lLnYoay5kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLk1lKCksYj09Ry5LZi5jb2RlJiZlLnYoay5Gcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5icSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTHUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5JZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTGYuY29kZTplLnYoay5ndyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLmh3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuR3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWGIoYSk7dGhpcy5SYSgpfSxYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9CmEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy4kZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLnd4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuYm8mJnRoaXMucGxheWVyLnZlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci52ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuWG4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLiRlJiZiLmxvYWQoKTtpZih0aGlzLlhoKGIpKXt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLiRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuJGU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm5wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy51dSgpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSx1dTpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiYKdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5hbyh0aGlzLmMub3JpZ2luLnZhKTt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLndoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuTHEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsCmRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmCiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5hYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5zYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVHYoKSx0aGlzLmIuYWMoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuWHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLmF3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT0KYS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlZiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuTC5iZHx8dGhpcy5RYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmCnRoaXMuVXYoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmZjKCkpLHRoaXMuVnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuaGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LFZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuWGMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uYz0hMX0sWHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxXdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxUdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7ZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5tZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7CmUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LCR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTsKZS5vZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sU3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmN3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5taSghMCl9LFhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIiwKYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpOwphLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2J8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5CbykpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5hZCYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLmFkPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5DZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLAp0aGlzLlphKCksITApLHRoaXMuTC50Z3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuTXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuTHYoKTt0aGlzLmhpKCk7dGhpcy5lZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmdkfHx0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZ2R8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLlJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxVbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSXUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmCnRoaXMuYy5TZCYmdGhpcy5Vbih0aGlzLmMuU2QpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5SZHx8KGUudihrLklzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucWMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLldiPXRoaXMuYWQ9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5JZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOgp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxQdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLldiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5hcCgpO3RoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5sdil0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5JZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT0KTWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnB2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi0KYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLldiPXRoaXMuYWQ9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5aYy5yZXBsYWNlKCJbdGltZV0iLAplLkNnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy52aHx8KHRoaXMudmg9ITAsdGhpcy5tZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHB2OmZ1bmN0aW9uKGEpe2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksCnRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5tZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmNpPWEpfSxQaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sS3U6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxMdTpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSwKWGE6ZnVuY3Rpb24oYSl7ZS5NZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5DZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMueGQmJnRoaXMueGQudHJhY2smJnRoaXMueGQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSnEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYKKHRoaXMua2U9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5IZC5pbXByZXNzaW9ucyYmZS5DcihnLnVybCx0aGlzLkhkLmltcHJlc3Npb25zKT90aGlzLktlKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Tbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnhwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09CnR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuV24oYyksZnx8KGY9dGhpcy5zZyksZXx8KGU9dGhpcy5zZyksdGhpcy5ZbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx4cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09CmJ9KX0sTXY6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLk52LmJpbmQodGhpcykpfSxOdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVmImJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sCkx2OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTsKdmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmNkJiYoYj10aGlzLkwuY2QpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmMuaWQ9dGhpcy5ycDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpOwp2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm52LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubXYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjsKYy5hcHBlbmRDaGlsZChmKTt0aGlzLmMubGYmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsCmIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlFlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5uYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSx5ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sbXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LG52OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuZ2R8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5rZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnRofHwhdGhpcy5MLlVjJiYic3BpZWdlbC5kZSIhPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5nZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm5nKCkpOih0aGlzLnRoPXRoaXMuUWM9dGhpcy5EZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmtlPSEwLGE9ZS5kZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5MZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbmc6ZnVuY3Rpb24oYSl7dGhpcy5OdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoITApfS5iaW5kKHRoaXMpLHRoaXMuanQpOih0aGlzLklkPSEwLHRoaXMuYi5CZSgpLHRoaXMuYi5idSgpLHRoaXMuYmM9ITEsCmUudihrLnFwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy54ZSgpLkdoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5WYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnNjJiYwPHRoaXMuc2MubGVuZ3RoJiYoYS5hZElkcz10aGlzLnNjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5SbysiLSIrdGhpcy5tZjt0aGlzLmMmJnRoaXMuYy5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ra3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLm50PXRoaXMuYVsyXTt0aGlzLnV3PXRoaXMuYVs0XTt0aGlzLmNuPXRoaXMuYVs5XTt0aGlzLnVwPXRoaXMuYVs3XTt0aGlzLmtqPXRoaXMuYVsyXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLlVrPXRoaXMuYVs0XTt0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfQpjLnN2PWI7Yi5wcm90b3R5cGU9eyRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hczp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm50OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51dzp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY246dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnVwOnRoaXMuamooYSl9LGpqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Vazp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5zdnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuJHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnJjPXRoaXMudGM9ITE7dGhpcy52YT0iIjt0aGlzLkJmPSExO3RoaXMuVGc9IiI7ZCYmZC5lbXB0eT90aGlzLmxzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2Mua249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUua2QoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnBnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkpkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5rcy5iaW5kKHRoaXMpLAp0aGlzLmdzLmJpbmQodGhpcykpfSxFZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5IcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxIcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGtzOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpOwp0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlRnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sbHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPXRoaXMuRWcoKTt0aGlzLnRjPXRoaXMucmYoKTt0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LGdzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSWYse2RlcHRoOmF9KSl9LEpjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuSnIoKT90aGlzLmZ2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTmcoKSxoLHtBZFN5c3RlbTp0aGlzLnJxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5MZikpOihhPTAsdGhpcy5EdigpJiZ0aGlzLldlKHRoaXMuc3AoKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMudGM/KHRoaXMudGM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQuUmUoKX0scWg6ZnVuY3Rpb24oKXt0aGlzLnJjPyh0aGlzLnJjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LnFoKCl9LER2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3YoKT90aGlzLmJ2KCk/ITA6KC0xIT10aGlzLkRjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVGQpKTp0aGlzLnNhKHRoaXMuU2Eody5FZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuU2MsRy5LZikpLCExKX0sV2U6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuU2R8fChhLlNkPVtdKTthLlNkLnB1c2godGhpcy5UZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk5lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnRjO2EucWM9YS5xYz9hLnFjOnRoaXMucmM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMucGFyZW50LldlKGEpfSxzcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkRjKCk7YS5PPXRoaXMuS2coKTthLlZiPXRoaXMudHEoKTthLkt2PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMucXEoKTthLmxmPXRoaXMuSHEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMudXEoKSk6Yi5QYS5jb25jYXQodGhpcy5DcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LlhiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuWGImJnRoaXMucGFyZW50LlhiKGIpLGE9MCx0aGlzLkpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sWGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuWGIoYSl9LHVnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGZ2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sY3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxidjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuRGMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVWg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnJmKCkmJihhPSEwKTtyZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEpyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuYWgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSx1cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sS2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksWXc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucGQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxEYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5IdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5rbnx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5acT10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLkh0PWI7Yi5wcm90b3R5cGU9e1lxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWnE6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuSHR8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLllxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuVmI9IiI7dGhpcy5CPXRoaXMucWM9dGhpcy50Yj0hMTt0aGlzLkNlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5EZT0iIn1jLmRtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LEFxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLApiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLkFxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5EZT1hfSxMcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuZG18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVs0XTt0aGlzLnFsPXRoaXMuYVs5XTt0aGlzLkVpPXRoaXMuYVsxMF07dGhpcy5icj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlNrPQpiO2IucHJvdG90eXBlPXtwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Ta3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMucHQoNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsCk9hOiJEVVJBVElPTl9FUlJPUiJ9LFNjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LExmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx6dzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LEF3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmRyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuaXI9YjtiLnByb3RvdHlwZT17Y3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5pcnx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuY3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5lcnJvcj1hO3RoaXMuamQ9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Taj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuU2p8fFVhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJqPXRoaXMuYVszXTt0aGlzLlNyPXRoaXMuYVs1XTt0aGlzLldrPXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNF07dGhpcy52cj10aGlzLmFbNV07dGhpcy5jcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5abD1iO2IucHJvdG90eXBlPXtBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5ScihhKX0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNyOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xazp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy51cihhKX0sCnVyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52cjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLlpsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Baig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5Pdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLm9sPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLnN4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlJ0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxvdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy52cShhKSl9fSx2cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntCeDohMCxBeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntveDoidmlkZW8iLER4OiJqc0N1c3RvbSIsRXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRng6MSxadzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEtxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5vdDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLktxKGIpLHZlbmRvcjpifSk7CnRoaXMuSnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk92Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxWbzpiLHl4OiExfSl9LEp1OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Gcnx8KGEucngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5vbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzVdO3RoaXMuam09dGhpcy5hWzJdO3RoaXMuWG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzEwXX1jLnBqPWI7Yi5wcm90b3R5cGU9e0VrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gazp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5wanx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuRWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXtwcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnBxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5WcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUXU6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZmQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFZxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxpcTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnFqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLlVvPXRoaXMuYVs2XTt0aGlzLkNpPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuY3U9YjtiLnByb3RvdHlwZT17ZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5lbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW86dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuJGwoYSl9LCRsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuY3V8fGJiLExjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmRuKDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSwKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSwKRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuSmx8fGNiOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPQohMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLmdxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5iYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmRkKCk7dGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sCmtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxMZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxnZzpmdW5jdGlvbigpe2lmKHRoaXMuZGQoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTsKdGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuV3d9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSwkdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5teCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuRGMoKTotMX0sRHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sZ3E6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksCjEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5EcShiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLklsfHxkYjsoZnVuY3Rpb24oYyl7Yy5LbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEdyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmhtLkpuLkhuP3dpbmRvdy5PTy5obS5Kbi5Ibi5VdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPQpkYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLktsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzhdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLlR1PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLmd1PWI7Yi5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QbDp0aGlzLmtxKGEpfSwKa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxxOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5UdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuZ3V8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLk9sKDQpOyhmdW5jdGlvbihjKXtjLllpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2coKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSwKemg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLllpfHxoYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5oZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLlhpfHxpYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5EZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksCnRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuaHF8fCh0aGlzLmhxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuQ2god2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLlppfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdD0KdGhpcy5hWzEwXTt0aGlzLlpwPXRoaXMuYVsxMF07dGhpcy5aaj10aGlzLmFbNF07dGhpcy5Tcz10aGlzLmFbMl07dGhpcy5ndD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLkRqPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnA6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpqOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tczp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkRqfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TmMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSwKTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLkxtfHxVOyhmdW5jdGlvbihjKXtjLkttPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTnMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlBxKCl9LE5zOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLkttfHxWOyhmdW5jdGlvbihjKXtjLk1tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPQpbXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy53ZCYmKGI9ZS55cChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksCnRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFljOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LGd2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5hdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSwKUHE6ZnVuY3Rpb24oKXtpZih0aGlzLkljKWZvcih2YXIgYj0wO2I8dGhpcy5JYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkljW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5ndihiKX19KX0pKGMpO3ZhciBsYj1jLk1tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Ncz10aGlzLmFbNV07dGhpcy5Vaj10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbMl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy54cj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5IbD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5xcj1iO2IucHJvdG90eXBlPXtMczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXM6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVqOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sazp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpvOnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHI6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnFuOnRoaXMua28oYSl9LGtvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sbzp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnFyfHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5Mcyg0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHwKb2I7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5XaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVsPXRoaXMuYVs5XTt0aGlzLkFvPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsyXTt0aGlzLld1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLk5pPXRoaXMuYVszXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuTm09YjtiLnByb3RvdHlwZT17dGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnVsOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbzp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc3Q6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLld1OnRoaXMua3QoYSl9LAprdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubHQ6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5OaTp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSms6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuTm18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnRsKDQpOyhmdW5jdGlvbihjKXtjLndsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVyhiKTt0aGlzLlooYSk7dGhpcy5RdCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLm11dGUmJnRoaXMuamEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxZZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLndsfHxzYjsoZnVuY3Rpb24oYyl7Yy52bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmCiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm9hKCkpO2EuS2EoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIHRiPWMudmx8fHRiOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMueGx8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy53aj10aGlzLmFbMV07dGhpcy5qaz10aGlzLmFbMl07dGhpcy5zbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLlNtPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2o6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmprOnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU218fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmdqKDQpOwooZnVuY3Rpb24oYyl7Yy53bj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LApOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLndufHx3YjsoZnVuY3Rpb24oYyl7Yy52bj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sT3Q6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj0KW10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudWM9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5PdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpOwpyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnZufHx4YjsoZnVuY3Rpb24oYyl7Yy54bj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7CnRoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLnhufHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG09dGhpcy5hWzZdO3RoaXMuS3M9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy54aj1iO2IucHJvdG90eXBlPXtDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lczp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy54anx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkNtKDQpOyhmdW5jdGlvbihjKXtjLndtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy52dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LE11OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMud218fEJiOyhmdW5jdGlvbihjKXtjLnZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ycz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5ycz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMudm18fENiOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMueG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbMl07dGhpcy51bT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmlqPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbzp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmlqfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuRG8oNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5wbXx8R2I7KGZ1bmN0aW9uKGMpe2Mub209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLm9kKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5acigpOnRoaXMuamcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuU2YoKXx8dGhpcy5tKCEwKX0sWnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5UdyYmYi5WdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMub2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0sb2Q6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LApueDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5vZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLm9tfHxIYjsoZnVuY3Rpb24oYyl7Yy5xbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMucW18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMTBdO3RoaXMueHQ9dGhpcy5hWzNdO3RoaXMuc2o9dGhpcy5hWzldO3RoaXMud3A9dGhpcy5hWzldO3RoaXMuQmw9dGhpcy5hWzddO3RoaXMuRm09dGhpcy5hWzZdO3RoaXMuUHA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy53bz1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnh0OnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLndwOnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbDp0aGlzLkVtKGEpfSxFbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRm06dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy53b3x8S2IsVGM9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuV3AoNCk7KGZ1bmN0aW9uKGMpe2MubGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sbHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sS2E6ZnVuY3Rpb24oKXt2YXIgYjtIPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPWMubGx8fFg7KGZ1bmN0aW9uKGMpe2Mua2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5ZZSYmYiE9dGhpcy5ZZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLmZhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS50eCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMua2x8fFk7KGZ1bmN0aW9uKGMpe2MubWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0g9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihIKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMubWx8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpsPXRoaXMuYVs1XTt0aGlzLm9yPXRoaXMuYVsxXTt0aGlzLkxqPXRoaXMuYVsxMF07dGhpcy5lbz10aGlzLmFbOV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5qdj10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbM107dGhpcy5Hbj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs0XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3lsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3I6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Majp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZW86dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFpOnRoaXMuaXYoYSl9LGl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuanY6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnJyfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy5naz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApodTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0scXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5na3x8T2I7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5ma3x8UGI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTsKaWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5oa3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLmF0PWI7Yi5wcm90b3R5cGU9e1ZzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Xczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMuYXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5Wcyg0KTsoZnVuY3Rpb24oYyl7Yy5Cbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxOZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sClB0OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlJjJiYodGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJjPSExKSx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksCiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuQm58fFRiOyhmdW5jdGlvbihjKXtjLkFuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksCmImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE9mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pOwp0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLlN0KCl9LFN0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYil7dGhpcy5VYihiKX0pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuTnQ9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5Bbnx8VWI7CihmdW5jdGlvbihjKXtjLkNuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuUHQoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLkNufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJrPXRoaXMuYVsxMF07dGhpcy55aT10aGlzLmFbNF07dGhpcy5SbT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLiRqPWI7Yi5wcm90b3R5cGU9e0FrOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuQms6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuJGp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkFrKDQpOyhmdW5jdGlvbihjKXtjLiRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuRHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGh1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Ec30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYodGhpcy54aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuJG18fE87KGZ1bmN0aW9uKGMpe2MuWm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy50dSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuWm18fFA7KGZ1bmN0aW9uKGMpe2MuYW49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYW58fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5PcT10aGlzLmFbMl07dGhpcy5SaT10aGlzLmFbM107dGhpcy5mbD10aGlzLmFbMV07dGhpcy5rcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLm5sPWI7Yi5wcm90b3R5cGU9e05xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmk6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ubHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuTnEoNCk7KGZ1bmN0aW9uKGMpe2MuWWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Za3x8WjsoZnVuY3Rpb24oYyl7Yy5Yaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLlhrfHxhYTsoZnVuY3Rpb24oYyl7Yy5aaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLlprfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGo9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtjajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLk9zfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5jaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5ia3x8ZGM7KGZ1bmN0aW9uKGMpe2MuYWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5ha3x8ZWM7KGZ1bmN0aW9uKGMpe2MuY2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLmNrfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmw9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuWHE9CnRoaXMuYVsxXTt0aGlzLllzPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs0XTt0aGlzLnRzPXRoaXMuYVsxXTt0aGlzLkVuPXRoaXMuYVsxMF07dGhpcy5HdD10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbNV07dGhpcy56cz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLnR2PWI7Yi5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemo6dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhxOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zczp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSGs6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRzOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Fbjp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLkd0OnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5KbTp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnR2fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hbCg0KTsoZnVuY3Rpb24oYyl7Yy5yaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubWUoKTt0aGlzLmZnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LApFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwOwppZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfSxtZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJgpiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD8KdGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzddO3RoaXMuQ3Y9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMuRmo9dGhpcy5hWzEwXTt0aGlzLnd3PXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVs5XTt0aGlzLnVuPXRoaXMuYVs0XTt0aGlzLkhtPXRoaXMuYVszXTt0aGlzLlBpPXRoaXMuYVs0XTt0aGlzLmxtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQXM9YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJqOnRoaXMuQnYoYSl9LEJ2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnl1Ogp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy52dyhhKX0sdnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnd3OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW46dGhpcy5HbShhKX0sR206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IbTp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5Bc3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuYWooNCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuZm09YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5FcShhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLAp0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMuemQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0sT3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMuemQubGVuZ3RoO2ErKyl0aGlzLnpkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5mbXx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs5XTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLlVsPXRoaXMuYVs2XTt0aGlzLllyPXRoaXMuYVs3XTt0aGlzLlVxPXRoaXMuYVs2XTt0aGlzLkx0PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs0XTt0aGlzLkdpPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLmpxPWI7Yi5wcm90b3R5cGU9e3lrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56azp0aGlzLnVvKGEpfSx1bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudm86dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVsOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zcjp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5MdDp0aGlzLldsKGEpfSxXbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhsOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuanF8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLnlrKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoKIiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLkV2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLkhzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7dmFyIEk9bmV3IEosbD0hMTtJLmthKCk7CkkuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnRyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbMTBdO3RoaXMuc209dGhpcy5hWzEwXTt0aGlzLlVzPXRoaXMuYVsxXTt0aGlzLmduPXRoaXMuYVsxMF07dGhpcy5CbT10aGlzLmFbOF07dGhpcy5zdz10aGlzLmFbN107dGhpcy5ldT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlFvPWI7Yi5wcm90b3R5cGU9e3RrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51azp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNtOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vczp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMucncoYSl9LHJ3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdzp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlFvfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9Cm51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnZpPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihhKXt0aGlzLm5iPWF9LGp1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLnlyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsdGhpcy5uYi53YSx0aGlzLm5iLmFmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMubmIuQmMpO2Vsc2UgaWYodGhpcy5ScSgpKXRoaXMuZnUoZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuUXUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7ClI9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuaXUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnFzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihjPXRoaXMucGxheWVyLkplKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsYyxmKTt0aGlzLnBsYXllci5MaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy51ZC5nZXRUaW1lKCksdGhpcy51ZD1hLDNFNTxiPyEwOiExO3RoaXMudWQ9YTtyZXR1cm4hMX0sRXU6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7CmUuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfSxEdTpmdW5jdGlvbihhKXtpZighdGhpcy55aCl7ZS5nZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMucHUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLAohMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LFZ0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIudnUodGhpcy5EdS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxGZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS5nZigibWlkcm9sbCIpO2lmKCF0aGlzLm5oKXt0aGlzLm5oPSEwO3ZhciBiPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksCnRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LFV0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIub3UodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5FdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLlV0KCk7dGhpcy5WdCgpfSxXdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5pdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQmQ9dGhpcy5BZC5sZW5ndGh9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9CiExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxmdTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRHQuYmluZCh0aGlzKSl9LER0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxxczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9dGhpcy5aZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy52aXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcz10aGlzLmFbMV07dGhpcy5VbT10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbNl07dGhpcy4kcz10aGlzLmFbM107dGhpcy5zbj10aGlzLmFbOF07CnRoaXMuZWs9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbM119Yy56bj1iO2IucHJvdG90eXBlPXtCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51aTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuJHM6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuem58fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkJzKDQpfSkuY2FsbChLdXRhZWNoZWRpZVBvWWFpLApLdXRhZWNoZWRpZVBvWWFpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.74.155
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- s3.eu-central-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 4158
|
265 B
436 B
|
7ms
6ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=7305295238
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEt1dGFlY2hlZGllUG9ZYWk9S3V0YWVjaGVkaWVQb1lhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5TbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5rdShtKTthLmp1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5zdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3I9dGhpcy5hWzddO3RoaXMub2o9dGhpcy5hWzNdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuSGo9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzddO3RoaXMuRGw9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzEwXTt0aGlzLkJwPXRoaXMuYVszXTt0aGlzLlJqPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMucHM9YjtiLnByb3RvdHlwZT17VnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53djp0aGlzLkdqKGEpfSwKR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkhqOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Objp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnA6dGhpcy5DbChhKX0sQ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRsOnRoaXMubnMoYSl9LG5zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5vczp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnA6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5wc3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuVnIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuU289CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk9jPVtdO3RoaXMub2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5DdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuU2c9e307dGhpcy5lZj0hMX1jLm1rPWI7Yi5wcm90b3R5cGU9e1B1OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWmI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5TZ1thXSYmKHRoaXMuU2dbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5QdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxhbzpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sQ3Q6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuQnQoYS5kYXRhKX0sQnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0saGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0scGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5IZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMua2goYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEhnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxabjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUubXEoYSkpcmV0dXJuOyhiPXRoaXMucGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxtcTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LElyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHllOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sR2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG9mOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxHZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LEVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwkaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwkcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxMbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx5bjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmNsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxDbzpmdW5jdGlvbigpe3JldHVybiBhLkppKCl8fGEuJGkoKXx8YS4kcSgpfHxhLkxsKCl8fGEueW4oKXx8YS5jbCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5DbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LCRiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LEdxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx5cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxIdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxDZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuZGkoYikrIjoiK3RoaXMuZGkoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxnZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHpnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5lZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LENjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy56ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkNjKEIpfSxFdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkdxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sSXU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlpiKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5lZShhKX0sZWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uS2MoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLktjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LE1kOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uS2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTWU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uYnAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSw1MDApfSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5IZShhKXx8dGhpcy5JcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmRmJiZ3aW5kb3cuc2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnhnKGEpKXJldHVybiB0aGlzLnhnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5abihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LGpzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmtoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGxoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5qcyhmLnNkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuT2M9YX0saXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEhvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5ta3x8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMubGs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi50dD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Hcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmJxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ZZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5RZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlZmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlpmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Sbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5UZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5jcT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmZkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuemM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlhmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Ubj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlhjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5hZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5jZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuU249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmtpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuSXM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi52ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5jdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuSHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmxrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp0PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbNV07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy5HdT10aGlzLmFbNF07dGhpcy5McD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLllsPWI7Yi5wcm90b3R5cGU9e3l0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56dDp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVzOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zazp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdvOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HdTp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTHA6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5ZbHx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMueXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5uaz1iO2IucHJvdG90eXBlPXtBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCsKbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxCcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxuZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubmQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5uZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPQphLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxrYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMubGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sdHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkJxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubmQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMubmt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmhsPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs3XTt0aGlzLnF3PXRoaXMuYVs5XTt0aGlzLkN1PXRoaXMuYVs0XTt0aGlzLkF1PXRoaXMuYVsxMF07dGhpcy5pdD10aGlzLmFbNl07dGhpcy5mdz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs2XX1jLnByPWI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5obDp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXI6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF3OnRoaXMuQnUoYSl9LEJ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5DdTp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQXU6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml0OnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLnByfHxrYSx3Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5nbCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PQp0eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MubGo9Yn0pKGMpO3ZhciBMPWMubGp8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnY9dGhpcy5hWzJdO3RoaXMudnM9dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMV19Yy4kcD1iO2IucHJvdG90eXBlPXtxdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnY6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ocjp0aGlzLlZtKGEpfSwKVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLldtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy4kcHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMucXYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5lbT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5sdShiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLAp0aGlzLkxjKSl9LGF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0senE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0uT3UoYil9LGZ4OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxEcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHh4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09Cm51bGx9fSl9KShjKTt2YXIgdD1jLmVtfHx0OyhmdW5jdGlvbihjKXtjLmdtPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSx2dTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxvdTpmdW5jdGlvbihiKXt0aGlzLlBlPQpifSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSwKRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSx6eDpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5TcSgpfHx0aGlzLlZuKCk7dGhpcy5EZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LFZuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJgpiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LGp4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSx1eDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYXg6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZ218fHA7KGZ1bmN0aW9uKGMpe2Mud2k9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy5Jbj0iMyI7dGhpcy5UYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdOwp0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5tdShhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHNyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldPwp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnNyKCk7aWYoIXRoaXMuQXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksCnRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sCnc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LHR1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Jbn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sUnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlRjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LG11OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx6cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LG1zOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy53aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUW49dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzZdO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMudms9YjtiLnByb3RvdHlwZT17UG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFuOnRoaXMuQ3AoYSl9LENwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EcDp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy52a3x8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuUG4oNCk7KGZ1bmN0aW9uKGMpe2MuVmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuVmp8fG9hOyhmdW5jdGlvbihjKXtjLldqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5TdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0KITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgcGE9Yy5Xanx8cGE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuWGp8fHFhOyhuZXcgcWEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UcD10aGlzLmFbOF07dGhpcy5UaT10aGlzLmFbMl07dGhpcy5Mbj10aGlzLmFbMl07dGhpcy5ubT10aGlzLmFbNF07dGhpcy55bz0KdGhpcy5hWzVdO3RoaXMuUXI9dGhpcy5hWzddO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuTm89dGhpcy5hWzVdO3RoaXMuTmw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5odj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHA6dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRpOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5tOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueW86dGhpcy5QcihhKX0sUHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFyOnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sdzp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5NbyhhKX0sCk1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmh2fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5TcCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3RoaXMud2coKTt0aGlzLnlnKCk7dGhpcy5wcD0hMX0sd2c6ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5jYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj0KYi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuY2M9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmCnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiYKYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sCnVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Pa3x8c2E7KGZ1bmN0aW9uKGMpe2MuTms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmCihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5WYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJgpiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS55ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuVmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5vaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLldjLmluZGV4T2YoYSkmJgp0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5XYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sbXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2Uub2YoYS52aWRlb1RhZyk/YS5jYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlZjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Oa3x8dGE7KGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy53cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkRyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCndxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Qa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLm9xPXRoaXMuYVszXTt0aGlzLm93PXRoaXMuYVszXTt0aGlzLmxwPXRoaXMuYVs3XTt0aGlzLnl2PXRoaXMuYVs4XTt0aGlzLkpwPXRoaXMuYVszXTt0aGlzLnRvPXRoaXMuYVsyXTt0aGlzLlltPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLiRrPWI7Yi5wcm90b3R5cGU9e0VsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GbDp0aGlzLm5xKGEpfSxucTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3E6dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm93OnRoaXMua3AoYSl9LAprcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHA6dGhpcy54dihhKX0seHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnl2OnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcDp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG86dGhpcy5YbShhKX0sWG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlltOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy4ka3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MubW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZmk9ITA7dGhpcy51Yz10aGlzLldnPSExO3RoaXMuRXMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnJoKCksdGhpcy5ZbygpLHRoaXMucmIoKSl9LEVzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LHZ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwKIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT8KYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwKIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5pZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sClliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxKZzpmdW5jdGlvbigpe2lmKCF0aGlzLkZjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LEJyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuenIoKTt3aW5kb3cuaW1hJiZiJiYKKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LHpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy4kYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuJGM9ITApO3JldHVybiB0aGlzLiRjfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWWIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5UdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsCiEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxUdDpmdW5jdGlvbigpe3RoaXMudWM9ITA7dmFyIGI9dGhpcy5KZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIiwKZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5vZyYmYi5hZHMmJih0aGlzLm9nPWIuYWRzKTtyZXR1cm4gdGhpcy5vZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpOwp0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5CcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlliKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlliKCksdGhpcy51Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOgoodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5abygpfS5iaW5kKHRoaXMpLAoxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxncDpmdW5jdGlvbigpe3RoaXMua3h8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSwKd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlF2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuJHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sJHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5sbnx8eWE7KGZ1bmN0aW9uKGMpe2Mubm49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTsKdmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbT10aGlzLmFbMV07dGhpcy5Qaj10aGlzLmFbMTBdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMuUnA9dGhpcy5hWzJdO3RoaXMuSHA9dGhpcy5hWzJdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMubm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5Daj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY206dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBqOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdjp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnA6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMueHcoYSl9LAp4dzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXc6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5Danx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuYm0oNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTsKcmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sdXQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueWQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCkFhOmZ1bmN0aW9uKCl7dGhpcy5WZSsrO2lmKDEwPHRoaXMuVmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBDYT1jLlJsfHxDYTsoZnVuY3Rpb24oYyl7Yy5RbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9CiEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7CnZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuZnE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLmZxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IudXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBEYT1jLlFsfHxEYTsoZnVuY3Rpb24oYyl7Yy5TbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYKKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlNsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG89dGhpcy5hWzddO3RoaXMuTGk9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzldO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuVXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Lcj1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5MaTp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucm86dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JaTp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLktyfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5Pbyg0KTsoZnVuY3Rpb24oYyl7Yy5Maz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5HZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmCihhPWEucGFyZW50Tm9kZSl9dGhpcy5BdD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQXQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7CnRoaXMubGQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5sZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZwOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmxkKTtlLkZlKHRoaXMubGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuTGt8fEhhOyhmdW5jdGlvbihjKXtjLktrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5HKCEwKX19KX0pKGMpO3ZhciBJYT1jLktrfHxJYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBiPQpsLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5Na3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5qPXRoaXMuYVs0XTt0aGlzLkpvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuVmw9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSm86dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5WbHx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuTWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLm9rPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG51OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sV246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5va3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsCmQsZil7dGhpcy4kYT1hO3RoaXMuQmc9dGhpcy5vaT0hMTt0aGlzLnNoPWQ7dGhpcy5TaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeihhKSk7dmFyIGM9dGhpcy5nYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5JZSh0aGlzLiRhLnVybCkmJm0uT2Qpe3ZhciBlPW5ldyB6KGEudXJsKTtlLm51KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMucGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQmcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuZ2IudXJsQ2FsbGVkPXRoaXMuJGEudXJsO3RyeXt0aGlzLlNoP3RoaXMuZ2Iub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLm9pfHwodGhpcy5nYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJgp0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmdiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5JZSh0aGlzLiRhLnVybCk/bS5PZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkllKHRoaXMuJGEudXJsKSx0aGlzLnNoJiZ0aGlzLnNoKCl9cmV0dXJuIHRoaXMuZ2J9fX0pKGMpO3ZhciBNYT1jLnBrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5XZD0hMX1jLm1qPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3RoaXMuV2Q9YX0scXU6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtCdzoiQWRDbGlja1RocnUiLER3OiJBZEVycm9yIixFdzoiQWRTdG9wcGVkIixIdzoiQWRMaW5lYXJDaGFuZ2UiLEl3OiJBZFRhZ1BhcnNlZCIsTHc6IkFkVmlkZW9Db21wbGV0ZSIsT3c6IkFkTG9hZGVkIixQdzoiQWRTa2lwcGVkIixRdzoiQWRTdGFydGVkIixGdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEd3OiJBZEltcHJlc3Npb24iLEN3OiJBZENyZWF0aXZlVmlldyIsSnc6IkFkVmlkZW9NaWRwb2ludCIsS3c6IkFkUGF1c2VkIixNdzoiQWRWaWRlb1N0YXJ0IixOdzoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmEodGhpcy5XZCxiW2RdKX0sWHQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlZkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlZkKXRoaXMuSGEuVmQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlZkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldkJiZ0aGlzLll0KCk7dGhpcy5IYSYmdGhpcy5YdCgpfX19KShjKTt2YXIgTmE9Yy5tanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPQohMTt0aGlzLnhjPSIiO3RoaXMuamU9dGhpcy53Yz10aGlzLndiPW51bGw7dGhpcy56cD10aGlzLkpiPXRoaXMuamg9ITE7dGhpcy5MYT0iIjt0aGlzLmVoPSExO3RoaXMud2E9dGhpcy5xZD0iIjt0aGlzLiRnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLmFmPSExO3RoaXMucGE9W107dGhpcy5QZz10aGlzLmdjPSIiO3RoaXMucmU9ITE7dGhpcy5zZj0wO3RoaXMuSGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMub2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmljPSIiO3RoaXMuamM9W107dGhpcy5rYz1bXTt0aGlzLktkPVtdO3RoaXMuaGM9IiI7dGhpcy50Zj0KMDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5FYz0hMTt0aGlzLmhwPXRoaXMuUWQ9bnVsbDt0aGlzLk5oPXRoaXMubWM9dGhpcy50Zz10aGlzLndmPXRoaXMuT2Q9dGhpcy5sZT10aGlzLlVjPSExO3RoaXMuaWI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucmQ9MDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuYmQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5QZj0iIn1jLnFrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMueGMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy53YyxhZHRhZ3JlZ2V4OnRoaXMuamUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuamgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuenAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCwKY2xpZW50Q29uZmlnOnRoaXMud2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLiRnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmdjLGhvbWFkQWRwYXRoOnRoaXMuUGcsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5yZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5zZixIT01BRF9WRVJJRklFRDp0aGlzLkhmLEhPTUFEX0JMT0NLRUQ6dGhpcy5GZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5vYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuR2YsdGVzdEhpZGU6dGhpcy5pYyx0ZXN0VGFnczp0aGlzLmpjLHRlc3RUYWdzSlM6dGhpcy5rYyx0ZXN0VGFnc1hIUjp0aGlzLktkLHRlc3RDb29raWU6dGhpcy5oYyx0aHJvdHRsZTp0aGlzLnRmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlVjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMubGUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuT2QsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMud2YsY29uZmlnRmFpbHVyZXM6dGhpcy5pYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5LaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMua2IsdnBhaWQ6dGhpcy5tYyxza2lwQWxsb3dlZDp0aGlzLk5oLHZtYXBzOnRoaXMubGksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLmJkLGFkRmFsbGJhY2tVUkw6dGhpcy5QZn19LFFxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmliKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaWJbYl0mJjE9PXRoaXMuaWJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5IbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkhlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkdjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5LYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnhjfHx0aGlzLndifHx0aGlzLndjfHx0aGlzLmplKSYmKGc9dGhpcy54cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnlxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5HYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sR2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuSGUoYSk7cmV0dXJuIGJ9LHlxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5YdztyZXR1cm4ibm9uZSJ9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5LaF19LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZCgpLGI9dGhpcy5NaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxwaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx3czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5waChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMucGgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx4czpmdW5jdGlvbihhKXt0aGlzLnhjJiYoYSs9dGhpcy54Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMud2MmJihhPXRoaXMud3MoYSx0aGlzLndjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi5ydShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIucXUoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZWg9ITA7dGhpcy5xZD1hO3RoaXMud2E9Yjt0aGlzLmFmPWQ7dGhpcy5RZD1mO3RoaXMuQmM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmhzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuZnMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueWMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLnFkK3RoaXMuZ2UoImdsb2JhbCIpKSx0aGlzLk1xLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LGZzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZ2UoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy55Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGdlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmxlKXt0aGlzLmxlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkJjPSExKTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuJGc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkZmKSk7dGhpcy5OYigpO2UuQ2Moay50dCk7KGI9ZS4kYih0aGlzLnNkKCkpKXx8KGI9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sTXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmdjfHx0aGlzLkxhfHx0aGlzLnljKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHljOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuR2MoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmdjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuUGc9YS5hZHBhdGh8fCIiO3RoaXMucmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5LaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkhjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxIYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLktjKCkpLGQ9dGhpcy56YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMuZ2UoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlJ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjdXN0b21lciIpO2E/dGhpcy55bT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLnltPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5IYyghMCl9LmJpbmQodGhpcyksITApfX0sUnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5FYz0hMDt0aGlzLkhjKCEwKTtyZXR1cm59fXRoaXMuT2Q9dGhpcy5NYihiLnN0cmljdCk7dGhpcy53Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5rYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5LZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy53Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuamU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuamg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubWM7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmNkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5saT1iLnZtYXBzfHwiIjt0aGlzLmJkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5QZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkZxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5yZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy50Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5FYz0hMCx0aGlzLkhjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLktkKT90aGlzLmFmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMubmUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmtkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFBjOmZ1bmN0aW9uKGEpe3RoaXMuVWM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKGEpKSx0aGlzLk5iKCksdGhpcy5uZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmljKXt2YXIgYT1lLmtkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5paCgpKXRoaXMuUGModGhpcy5vYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuV2goKX19ZWxzZSB0aGlzLldoKCl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5wZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuS2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBmKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxXaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVmguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVmgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxwZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMuc2YrKyx0aGlzLkRhKG5ldyB6KHRoaXMuaGMpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMucWYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5UaCgpfSxxZjpmdW5jdGlvbihhKXt0aGlzLlBjKHRoaXMuR2YsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5zZj90aGlzLnBmKCk6dGhpcy5xZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlRoKCk6dGhpcy5xZigiQUFBIil9LFRoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubmUoKX0saWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlVjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmloKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5IZikpO3RoaXMuUWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5RZCYmdGhpcy5RZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMud2YmJnRoaXMuUXEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sJGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEub2k9ITApO3EmJmUuRXIoKSYmKGEuQmc9ITApO2cmJihhLlNoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmJiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5HYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sVXU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmxpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLkl2LmJpbmQodGhpcyksdGhpcy5Idi5iaW5kKHRoaXMpKX0sSXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LEh2OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkNjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG5lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmJiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sa3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sRnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5xa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLmpsPXRoaXMuYVs4XTt0aGlzLk9yPXRoaXMuYVs3XTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLk5wPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuYXE9YjtiLnByb3RvdHlwZT17d2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9yOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXI6dGhpcy5NcChhKX0sTXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5wOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7CnZhciBQYT1jLmFxfHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy53ayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWWcmJmEuZi5ZZyh7cGF1c2U6dGhpcy55ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMudXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLldiPXRoaXMuYWQ9ITE7dGhpcy5Cbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlJvPWUuYWEoMTApOwp0aGlzLm1mPTA7dGhpcy5aYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlpjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLlpjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudGg9dGhpcy5HZD0hMTt0aGlzLm1oPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYmM9ITE7dGhpcy5ycD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SZD0KdGhpcy5PYj10aGlzLnBlPXRoaXMuZ2Q9dGhpcy5JZD10aGlzLnNiPXRoaXMubmM9dGhpcy52aD10aGlzLm1kPXRoaXMubHY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMuc2M9W107dGhpcy5kYz17fTt0aGlzLmp0PTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy54ZD17fX1jLmtrPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5LdSgpO2UudihrLlRuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9CmM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuY3AoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubWgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLkxlKGEsYixjKX0sNTApfX0sV2U6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5tZD0hMTt0aGlzLmM9YTt0aGlzLnd1KHRoaXMuYyk7dGhpcy54ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTWcoYSk7dGhpcy5zYz10aGlzLkRnKGEpO3RoaXMubXAoKX0sTWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSGQ9dGhpcy5JcShhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkRnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuc3EoYSkpKTtyZXR1cm4gY30sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LElxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuamQmJmEuamQuZXJyb3ImJmEuamQuZXJyb3IuY29kZSYmCihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUcuWGQuY29kZT9lLnYoay5kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLk1lKCksYj09Ry5LZi5jb2RlJiZlLnYoay5Gcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5icSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTHUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5JZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTGYuY29kZTplLnYoay5ndyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLmh3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuR3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWGIoYSk7dGhpcy5SYSgpfSxYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9CmEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy4kZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLnd4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuYm8mJnRoaXMucGxheWVyLnZlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci52ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuWG4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLiRlJiZiLmxvYWQoKTtpZih0aGlzLlhoKGIpKXt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLiRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuJGU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm5wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy51dSgpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSx1dTpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiYKdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5hbyh0aGlzLmMub3JpZ2luLnZhKTt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLndoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuTHEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsCmRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmCiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5hYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5zYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVHYoKSx0aGlzLmIuYWMoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuWHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLmF3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT0KYS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlZiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuTC5iZHx8dGhpcy5RYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmCnRoaXMuVXYoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmZjKCkpLHRoaXMuVnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuaGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LFZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuWGMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uYz0hMX0sWHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxXdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxUdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7ZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5tZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7CmUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LCR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTsKZS5vZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sU3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmN3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5taSghMCl9LFhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIiwKYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpOwphLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2J8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5CbykpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5hZCYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLmFkPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5DZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLAp0aGlzLlphKCksITApLHRoaXMuTC50Z3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuTXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuTHYoKTt0aGlzLmhpKCk7dGhpcy5lZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmdkfHx0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZ2R8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLlJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxVbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSXUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmCnRoaXMuYy5TZCYmdGhpcy5Vbih0aGlzLmMuU2QpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5SZHx8KGUudihrLklzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucWMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLldiPXRoaXMuYWQ9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5JZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOgp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxQdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLldiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5hcCgpO3RoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5sdil0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5JZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT0KTWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnB2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi0KYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLldiPXRoaXMuYWQ9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5aYy5yZXBsYWNlKCJbdGltZV0iLAplLkNnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy52aHx8KHRoaXMudmg9ITAsdGhpcy5tZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHB2OmZ1bmN0aW9uKGEpe2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksCnRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5tZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmNpPWEpfSxQaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sS3U6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxMdTpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSwKWGE6ZnVuY3Rpb24oYSl7ZS5NZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5DZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMueGQmJnRoaXMueGQudHJhY2smJnRoaXMueGQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSnEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYKKHRoaXMua2U9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5IZC5pbXByZXNzaW9ucyYmZS5DcihnLnVybCx0aGlzLkhkLmltcHJlc3Npb25zKT90aGlzLktlKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Tbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnhwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09CnR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuV24oYyksZnx8KGY9dGhpcy5zZyksZXx8KGU9dGhpcy5zZyksdGhpcy5ZbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx4cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09CmJ9KX0sTXY6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLk52LmJpbmQodGhpcykpfSxOdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVmImJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sCkx2OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTsKdmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmNkJiYoYj10aGlzLkwuY2QpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmMuaWQ9dGhpcy5ycDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpOwp2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm52LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubXYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjsKYy5hcHBlbmRDaGlsZChmKTt0aGlzLmMubGYmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsCmIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlFlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5uYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSx5ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sbXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LG52OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuZ2R8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5rZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnRofHwhdGhpcy5MLlVjJiYic3BpZWdlbC5kZSIhPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5nZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm5nKCkpOih0aGlzLnRoPXRoaXMuUWM9dGhpcy5EZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmtlPSEwLGE9ZS5kZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5MZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbmc6ZnVuY3Rpb24oYSl7dGhpcy5OdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoITApfS5iaW5kKHRoaXMpLHRoaXMuanQpOih0aGlzLklkPSEwLHRoaXMuYi5CZSgpLHRoaXMuYi5idSgpLHRoaXMuYmM9ITEsCmUudihrLnFwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy54ZSgpLkdoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5WYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnNjJiYwPHRoaXMuc2MubGVuZ3RoJiYoYS5hZElkcz10aGlzLnNjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5SbysiLSIrdGhpcy5tZjt0aGlzLmMmJnRoaXMuYy5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ra3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLm50PXRoaXMuYVsyXTt0aGlzLnV3PXRoaXMuYVs0XTt0aGlzLmNuPXRoaXMuYVs5XTt0aGlzLnVwPXRoaXMuYVs3XTt0aGlzLmtqPXRoaXMuYVsyXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLlVrPXRoaXMuYVs0XTt0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfQpjLnN2PWI7Yi5wcm90b3R5cGU9eyRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hczp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm50OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51dzp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY246dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnVwOnRoaXMuamooYSl9LGpqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Vazp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5zdnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuJHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnJjPXRoaXMudGM9ITE7dGhpcy52YT0iIjt0aGlzLkJmPSExO3RoaXMuVGc9IiI7ZCYmZC5lbXB0eT90aGlzLmxzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2Mua249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUua2QoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnBnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkpkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5rcy5iaW5kKHRoaXMpLAp0aGlzLmdzLmJpbmQodGhpcykpfSxFZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5IcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxIcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGtzOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpOwp0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlRnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sbHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPXRoaXMuRWcoKTt0aGlzLnRjPXRoaXMucmYoKTt0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LGdzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSWYse2RlcHRoOmF9KSl9LEpjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuSnIoKT90aGlzLmZ2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTmcoKSxoLHtBZFN5c3RlbTp0aGlzLnJxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5MZikpOihhPTAsdGhpcy5EdigpJiZ0aGlzLldlKHRoaXMuc3AoKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMudGM/KHRoaXMudGM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQuUmUoKX0scWg6ZnVuY3Rpb24oKXt0aGlzLnJjPyh0aGlzLnJjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LnFoKCl9LER2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3YoKT90aGlzLmJ2KCk/ITA6KC0xIT10aGlzLkRjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVGQpKTp0aGlzLnNhKHRoaXMuU2Eody5FZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuU2MsRy5LZikpLCExKX0sV2U6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuU2R8fChhLlNkPVtdKTthLlNkLnB1c2godGhpcy5UZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk5lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnRjO2EucWM9YS5xYz9hLnFjOnRoaXMucmM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMucGFyZW50LldlKGEpfSxzcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkRjKCk7YS5PPXRoaXMuS2coKTthLlZiPXRoaXMudHEoKTthLkt2PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMucXEoKTthLmxmPXRoaXMuSHEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMudXEoKSk6Yi5QYS5jb25jYXQodGhpcy5DcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LlhiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuWGImJnRoaXMucGFyZW50LlhiKGIpLGE9MCx0aGlzLkpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sWGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuWGIoYSl9LHVnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGZ2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sY3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxidjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuRGMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVWg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnJmKCkmJihhPSEwKTtyZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEpyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuYWgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSx1cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sS2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksWXc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucGQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxEYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5IdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5rbnx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5acT10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLkh0PWI7Yi5wcm90b3R5cGU9e1lxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWnE6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuSHR8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLllxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuVmI9IiI7dGhpcy5CPXRoaXMucWM9dGhpcy50Yj0hMTt0aGlzLkNlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5EZT0iIn1jLmRtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LEFxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLApiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLkFxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5EZT1hfSxMcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuZG18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVs0XTt0aGlzLnFsPXRoaXMuYVs5XTt0aGlzLkVpPXRoaXMuYVsxMF07dGhpcy5icj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlNrPQpiO2IucHJvdG90eXBlPXtwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Ta3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMucHQoNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsCk9hOiJEVVJBVElPTl9FUlJPUiJ9LFNjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LExmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx6dzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LEF3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmRyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuaXI9YjtiLnByb3RvdHlwZT17Y3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5pcnx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuY3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5lcnJvcj1hO3RoaXMuamQ9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Taj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuU2p8fFVhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJqPXRoaXMuYVszXTt0aGlzLlNyPXRoaXMuYVs1XTt0aGlzLldrPXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNF07dGhpcy52cj10aGlzLmFbNV07dGhpcy5jcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5abD1iO2IucHJvdG90eXBlPXtBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5ScihhKX0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNyOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xazp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy51cihhKX0sCnVyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52cjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLlpsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Baig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5Pdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLm9sPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLnN4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlJ0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxvdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy52cShhKSl9fSx2cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntCeDohMCxBeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntveDoidmlkZW8iLER4OiJqc0N1c3RvbSIsRXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRng6MSxadzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEtxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5vdDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLktxKGIpLHZlbmRvcjpifSk7CnRoaXMuSnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk92Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxWbzpiLHl4OiExfSl9LEp1OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Gcnx8KGEucngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5vbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzVdO3RoaXMuam09dGhpcy5hWzJdO3RoaXMuWG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzEwXX1jLnBqPWI7Yi5wcm90b3R5cGU9e0VrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gazp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5wanx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuRWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXtwcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnBxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5WcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUXU6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZmQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFZxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxpcTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnFqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLlVvPXRoaXMuYVs2XTt0aGlzLkNpPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuY3U9YjtiLnByb3RvdHlwZT17ZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5lbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW86dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuJGwoYSl9LCRsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuY3V8fGJiLExjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmRuKDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSwKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSwKRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuSmx8fGNiOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPQohMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLmdxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5iYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmRkKCk7dGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sCmtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxMZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxnZzpmdW5jdGlvbigpe2lmKHRoaXMuZGQoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTsKdGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuV3d9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSwkdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5teCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuRGMoKTotMX0sRHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sZ3E6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksCjEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5EcShiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLklsfHxkYjsoZnVuY3Rpb24oYyl7Yy5LbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEdyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmhtLkpuLkhuP3dpbmRvdy5PTy5obS5Kbi5Ibi5VdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPQpkYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLktsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzhdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLlR1PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLmd1PWI7Yi5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QbDp0aGlzLmtxKGEpfSwKa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxxOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5UdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuZ3V8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLk9sKDQpOyhmdW5jdGlvbihjKXtjLllpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2coKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSwKemg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLllpfHxoYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5oZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLlhpfHxpYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5EZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksCnRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuaHF8fCh0aGlzLmhxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuQ2god2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLlppfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdD0KdGhpcy5hWzEwXTt0aGlzLlpwPXRoaXMuYVsxMF07dGhpcy5aaj10aGlzLmFbNF07dGhpcy5Tcz10aGlzLmFbMl07dGhpcy5ndD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLkRqPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnA6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpqOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tczp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkRqfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TmMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSwKTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLkxtfHxVOyhmdW5jdGlvbihjKXtjLkttPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTnMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlBxKCl9LE5zOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLkttfHxWOyhmdW5jdGlvbihjKXtjLk1tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPQpbXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy53ZCYmKGI9ZS55cChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksCnRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFljOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LGd2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5hdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSwKUHE6ZnVuY3Rpb24oKXtpZih0aGlzLkljKWZvcih2YXIgYj0wO2I8dGhpcy5JYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkljW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5ndihiKX19KX0pKGMpO3ZhciBsYj1jLk1tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Ncz10aGlzLmFbNV07dGhpcy5Vaj10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbMl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy54cj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5IbD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5xcj1iO2IucHJvdG90eXBlPXtMczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXM6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVqOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sazp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpvOnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHI6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnFuOnRoaXMua28oYSl9LGtvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sbzp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnFyfHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5Mcyg0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHwKb2I7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5XaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVsPXRoaXMuYVs5XTt0aGlzLkFvPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsyXTt0aGlzLld1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLk5pPXRoaXMuYVszXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuTm09YjtiLnByb3RvdHlwZT17dGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnVsOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbzp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc3Q6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLld1OnRoaXMua3QoYSl9LAprdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubHQ6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5OaTp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSms6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuTm18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnRsKDQpOyhmdW5jdGlvbihjKXtjLndsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVyhiKTt0aGlzLlooYSk7dGhpcy5RdCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLm11dGUmJnRoaXMuamEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxZZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLndsfHxzYjsoZnVuY3Rpb24oYyl7Yy52bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmCiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm9hKCkpO2EuS2EoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIHRiPWMudmx8fHRiOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMueGx8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy53aj10aGlzLmFbMV07dGhpcy5qaz10aGlzLmFbMl07dGhpcy5zbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLlNtPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2o6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmprOnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU218fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmdqKDQpOwooZnVuY3Rpb24oYyl7Yy53bj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LApOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLndufHx3YjsoZnVuY3Rpb24oYyl7Yy52bj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sT3Q6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj0KW10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudWM9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5PdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpOwpyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnZufHx4YjsoZnVuY3Rpb24oYyl7Yy54bj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7CnRoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLnhufHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG09dGhpcy5hWzZdO3RoaXMuS3M9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy54aj1iO2IucHJvdG90eXBlPXtDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lczp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy54anx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkNtKDQpOyhmdW5jdGlvbihjKXtjLndtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy52dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LE11OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMud218fEJiOyhmdW5jdGlvbihjKXtjLnZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ycz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5ycz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMudm18fENiOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMueG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbMl07dGhpcy51bT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmlqPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbzp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmlqfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuRG8oNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5wbXx8R2I7KGZ1bmN0aW9uKGMpe2Mub209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLm9kKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5acigpOnRoaXMuamcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuU2YoKXx8dGhpcy5tKCEwKX0sWnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5UdyYmYi5WdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMub2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0sb2Q6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LApueDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5vZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLm9tfHxIYjsoZnVuY3Rpb24oYyl7Yy5xbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMucW18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMTBdO3RoaXMueHQ9dGhpcy5hWzNdO3RoaXMuc2o9dGhpcy5hWzldO3RoaXMud3A9dGhpcy5hWzldO3RoaXMuQmw9dGhpcy5hWzddO3RoaXMuRm09dGhpcy5hWzZdO3RoaXMuUHA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy53bz1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnh0OnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLndwOnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbDp0aGlzLkVtKGEpfSxFbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRm06dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy53b3x8S2IsVGM9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuV3AoNCk7KGZ1bmN0aW9uKGMpe2MubGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sbHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sS2E6ZnVuY3Rpb24oKXt2YXIgYjtIPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPWMubGx8fFg7KGZ1bmN0aW9uKGMpe2Mua2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5ZZSYmYiE9dGhpcy5ZZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLmZhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS50eCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMua2x8fFk7KGZ1bmN0aW9uKGMpe2MubWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0g9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihIKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMubWx8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpsPXRoaXMuYVs1XTt0aGlzLm9yPXRoaXMuYVsxXTt0aGlzLkxqPXRoaXMuYVsxMF07dGhpcy5lbz10aGlzLmFbOV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5qdj10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbM107dGhpcy5Hbj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs0XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3lsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3I6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Majp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZW86dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFpOnRoaXMuaXYoYSl9LGl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuanY6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnJyfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy5naz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApodTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0scXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5na3x8T2I7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5ma3x8UGI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTsKaWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5oa3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLmF0PWI7Yi5wcm90b3R5cGU9e1ZzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Xczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMuYXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5Wcyg0KTsoZnVuY3Rpb24oYyl7Yy5Cbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxOZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sClB0OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlJjJiYodGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJjPSExKSx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksCiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuQm58fFRiOyhmdW5jdGlvbihjKXtjLkFuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksCmImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE9mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pOwp0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLlN0KCl9LFN0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYil7dGhpcy5VYihiKX0pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuTnQ9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5Bbnx8VWI7CihmdW5jdGlvbihjKXtjLkNuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuUHQoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLkNufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJrPXRoaXMuYVsxMF07dGhpcy55aT10aGlzLmFbNF07dGhpcy5SbT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLiRqPWI7Yi5wcm90b3R5cGU9e0FrOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuQms6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuJGp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkFrKDQpOyhmdW5jdGlvbihjKXtjLiRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuRHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGh1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Ec30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYodGhpcy54aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuJG18fE87KGZ1bmN0aW9uKGMpe2MuWm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy50dSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuWm18fFA7KGZ1bmN0aW9uKGMpe2MuYW49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYW58fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5PcT10aGlzLmFbMl07dGhpcy5SaT10aGlzLmFbM107dGhpcy5mbD10aGlzLmFbMV07dGhpcy5rcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLm5sPWI7Yi5wcm90b3R5cGU9e05xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmk6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ubHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuTnEoNCk7KGZ1bmN0aW9uKGMpe2MuWWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Za3x8WjsoZnVuY3Rpb24oYyl7Yy5Yaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLlhrfHxhYTsoZnVuY3Rpb24oYyl7Yy5aaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLlprfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGo9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtjajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLk9zfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5jaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5ia3x8ZGM7KGZ1bmN0aW9uKGMpe2MuYWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5ha3x8ZWM7KGZ1bmN0aW9uKGMpe2MuY2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLmNrfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmw9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuWHE9CnRoaXMuYVsxXTt0aGlzLllzPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs0XTt0aGlzLnRzPXRoaXMuYVsxXTt0aGlzLkVuPXRoaXMuYVsxMF07dGhpcy5HdD10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbNV07dGhpcy56cz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLnR2PWI7Yi5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemo6dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhxOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zczp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSGs6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRzOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Fbjp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLkd0OnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5KbTp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnR2fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hbCg0KTsoZnVuY3Rpb24oYyl7Yy5yaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubWUoKTt0aGlzLmZnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LApFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwOwppZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfSxtZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJgpiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD8KdGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzddO3RoaXMuQ3Y9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMuRmo9dGhpcy5hWzEwXTt0aGlzLnd3PXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVs5XTt0aGlzLnVuPXRoaXMuYVs0XTt0aGlzLkhtPXRoaXMuYVszXTt0aGlzLlBpPXRoaXMuYVs0XTt0aGlzLmxtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQXM9YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJqOnRoaXMuQnYoYSl9LEJ2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnl1Ogp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy52dyhhKX0sdnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnd3OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW46dGhpcy5HbShhKX0sR206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IbTp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5Bc3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuYWooNCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuZm09YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5FcShhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLAp0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMuemQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0sT3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMuemQubGVuZ3RoO2ErKyl0aGlzLnpkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5mbXx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs5XTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLlVsPXRoaXMuYVs2XTt0aGlzLllyPXRoaXMuYVs3XTt0aGlzLlVxPXRoaXMuYVs2XTt0aGlzLkx0PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs0XTt0aGlzLkdpPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLmpxPWI7Yi5wcm90b3R5cGU9e3lrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56azp0aGlzLnVvKGEpfSx1bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudm86dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVsOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zcjp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5MdDp0aGlzLldsKGEpfSxXbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhsOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuanF8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLnlrKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoKIiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLkV2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLkhzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7dmFyIEk9bmV3IEosbD0hMTtJLmthKCk7CkkuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnRyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbMTBdO3RoaXMuc209dGhpcy5hWzEwXTt0aGlzLlVzPXRoaXMuYVsxXTt0aGlzLmduPXRoaXMuYVsxMF07dGhpcy5CbT10aGlzLmFbOF07dGhpcy5zdz10aGlzLmFbN107dGhpcy5ldT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlFvPWI7Yi5wcm90b3R5cGU9e3RrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51azp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNtOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vczp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMucncoYSl9LHJ3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdzp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlFvfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9Cm51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnZpPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihhKXt0aGlzLm5iPWF9LGp1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLnlyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsdGhpcy5uYi53YSx0aGlzLm5iLmFmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMubmIuQmMpO2Vsc2UgaWYodGhpcy5ScSgpKXRoaXMuZnUoZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuUXUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7ClI9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuaXUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnFzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihjPXRoaXMucGxheWVyLkplKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsYyxmKTt0aGlzLnBsYXllci5MaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy51ZC5nZXRUaW1lKCksdGhpcy51ZD1hLDNFNTxiPyEwOiExO3RoaXMudWQ9YTtyZXR1cm4hMX0sRXU6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7CmUuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfSxEdTpmdW5jdGlvbihhKXtpZighdGhpcy55aCl7ZS5nZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMucHUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLAohMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LFZ0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIudnUodGhpcy5EdS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxGZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS5nZigibWlkcm9sbCIpO2lmKCF0aGlzLm5oKXt0aGlzLm5oPSEwO3ZhciBiPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksCnRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LFV0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIub3UodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5FdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLlV0KCk7dGhpcy5WdCgpfSxXdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5pdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQmQ9dGhpcy5BZC5sZW5ndGh9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9CiExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxmdTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRHQuYmluZCh0aGlzKSl9LER0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxxczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9dGhpcy5aZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy52aXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcz10aGlzLmFbMV07dGhpcy5VbT10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbNl07dGhpcy4kcz10aGlzLmFbM107dGhpcy5zbj10aGlzLmFbOF07CnRoaXMuZWs9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbM119Yy56bj1iO2IucHJvdG90eXBlPXtCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51aTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuJHM6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuem58fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkJzKDQpfSkuY2FsbChLdXRhZWNoZWRpZVBvWWFpLApLdXRhZWNoZWRpZVBvWWFpKTsK
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
109.71.25.30
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 4158
|
653 B
1 KB
|
6ms
6ms
|
XHR
application/json |
13.224.196.120
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=1508110567
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEt1dGFlY2hlZGllUG9ZYWk9S3V0YWVjaGVkaWVQb1lhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5TbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5rdShtKTthLmp1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5zdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3I9dGhpcy5hWzddO3RoaXMub2o9dGhpcy5hWzNdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuSGo9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzddO3RoaXMuRGw9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzEwXTt0aGlzLkJwPXRoaXMuYVszXTt0aGlzLlJqPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMucHM9YjtiLnByb3RvdHlwZT17VnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53djp0aGlzLkdqKGEpfSwKR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkhqOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Objp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnA6dGhpcy5DbChhKX0sQ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRsOnRoaXMubnMoYSl9LG5zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5vczp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnA6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5wc3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuVnIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuU289CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk9jPVtdO3RoaXMub2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5DdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuU2c9e307dGhpcy5lZj0hMX1jLm1rPWI7Yi5wcm90b3R5cGU9e1B1OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWmI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5TZ1thXSYmKHRoaXMuU2dbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5QdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxhbzpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sQ3Q6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuQnQoYS5kYXRhKX0sQnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0saGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0scGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5IZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMua2goYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEhnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxabjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUubXEoYSkpcmV0dXJuOyhiPXRoaXMucGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxtcTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LElyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHllOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sR2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG9mOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxHZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LEVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwkaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwkcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxMbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx5bjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmNsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxDbzpmdW5jdGlvbigpe3JldHVybiBhLkppKCl8fGEuJGkoKXx8YS4kcSgpfHxhLkxsKCl8fGEueW4oKXx8YS5jbCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5DbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LCRiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LEdxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx5cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxIdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxDZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuZGkoYikrIjoiK3RoaXMuZGkoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxnZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHpnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5lZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LENjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy56ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkNjKEIpfSxFdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkdxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sSXU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlpiKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5lZShhKX0sZWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uS2MoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLktjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LE1kOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uS2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTWU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uYnAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSw1MDApfSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5IZShhKXx8dGhpcy5JcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmRmJiZ3aW5kb3cuc2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnhnKGEpKXJldHVybiB0aGlzLnhnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5abihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LGpzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmtoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGxoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5qcyhmLnNkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuT2M9YX0saXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEhvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5ta3x8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMubGs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi50dD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Hcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmJxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ZZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5RZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlZmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlpmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Sbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5UZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5jcT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmZkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuemM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlhmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Ubj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlhjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5hZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5jZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuU249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmtpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuSXM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi52ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5jdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuSHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmxrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp0PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbNV07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy5HdT10aGlzLmFbNF07dGhpcy5McD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLllsPWI7Yi5wcm90b3R5cGU9e3l0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56dDp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVzOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zazp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdvOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HdTp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTHA6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5ZbHx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMueXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5uaz1iO2IucHJvdG90eXBlPXtBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCsKbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxCcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxuZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubmQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5uZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPQphLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxrYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMubGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sdHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkJxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubmQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMubmt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmhsPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs3XTt0aGlzLnF3PXRoaXMuYVs5XTt0aGlzLkN1PXRoaXMuYVs0XTt0aGlzLkF1PXRoaXMuYVsxMF07dGhpcy5pdD10aGlzLmFbNl07dGhpcy5mdz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs2XX1jLnByPWI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5obDp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXI6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF3OnRoaXMuQnUoYSl9LEJ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5DdTp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQXU6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml0OnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLnByfHxrYSx3Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5nbCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PQp0eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MubGo9Yn0pKGMpO3ZhciBMPWMubGp8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnY9dGhpcy5hWzJdO3RoaXMudnM9dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMV19Yy4kcD1iO2IucHJvdG90eXBlPXtxdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnY6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ocjp0aGlzLlZtKGEpfSwKVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLldtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy4kcHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMucXYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5lbT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5sdShiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLAp0aGlzLkxjKSl9LGF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0senE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0uT3UoYil9LGZ4OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxEcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHh4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09Cm51bGx9fSl9KShjKTt2YXIgdD1jLmVtfHx0OyhmdW5jdGlvbihjKXtjLmdtPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSx2dTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxvdTpmdW5jdGlvbihiKXt0aGlzLlBlPQpifSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSwKRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSx6eDpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5TcSgpfHx0aGlzLlZuKCk7dGhpcy5EZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LFZuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJgpiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LGp4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSx1eDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYXg6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZ218fHA7KGZ1bmN0aW9uKGMpe2Mud2k9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy5Jbj0iMyI7dGhpcy5UYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdOwp0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5tdShhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHNyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldPwp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnNyKCk7aWYoIXRoaXMuQXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksCnRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sCnc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LHR1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Jbn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sUnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlRjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LG11OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx6cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LG1zOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy53aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUW49dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzZdO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMudms9YjtiLnByb3RvdHlwZT17UG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFuOnRoaXMuQ3AoYSl9LENwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EcDp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy52a3x8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuUG4oNCk7KGZ1bmN0aW9uKGMpe2MuVmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuVmp8fG9hOyhmdW5jdGlvbihjKXtjLldqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5TdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0KITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgcGE9Yy5Xanx8cGE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuWGp8fHFhOyhuZXcgcWEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UcD10aGlzLmFbOF07dGhpcy5UaT10aGlzLmFbMl07dGhpcy5Mbj10aGlzLmFbMl07dGhpcy5ubT10aGlzLmFbNF07dGhpcy55bz0KdGhpcy5hWzVdO3RoaXMuUXI9dGhpcy5hWzddO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuTm89dGhpcy5hWzVdO3RoaXMuTmw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5odj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHA6dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRpOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5tOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueW86dGhpcy5QcihhKX0sUHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFyOnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sdzp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5NbyhhKX0sCk1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmh2fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5TcCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3RoaXMud2coKTt0aGlzLnlnKCk7dGhpcy5wcD0hMX0sd2c6ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5jYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj0KYi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuY2M9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmCnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiYKYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sCnVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Pa3x8c2E7KGZ1bmN0aW9uKGMpe2MuTms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmCihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5WYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJgpiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS55ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuVmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5vaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLldjLmluZGV4T2YoYSkmJgp0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5XYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sbXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2Uub2YoYS52aWRlb1RhZyk/YS5jYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlZjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Oa3x8dGE7KGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy53cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkRyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCndxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Qa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLm9xPXRoaXMuYVszXTt0aGlzLm93PXRoaXMuYVszXTt0aGlzLmxwPXRoaXMuYVs3XTt0aGlzLnl2PXRoaXMuYVs4XTt0aGlzLkpwPXRoaXMuYVszXTt0aGlzLnRvPXRoaXMuYVsyXTt0aGlzLlltPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLiRrPWI7Yi5wcm90b3R5cGU9e0VsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GbDp0aGlzLm5xKGEpfSxucTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3E6dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm93OnRoaXMua3AoYSl9LAprcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHA6dGhpcy54dihhKX0seHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnl2OnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcDp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG86dGhpcy5YbShhKX0sWG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlltOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy4ka3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MubW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZmk9ITA7dGhpcy51Yz10aGlzLldnPSExO3RoaXMuRXMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnJoKCksdGhpcy5ZbygpLHRoaXMucmIoKSl9LEVzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LHZ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwKIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT8KYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwKIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5pZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sClliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxKZzpmdW5jdGlvbigpe2lmKCF0aGlzLkZjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LEJyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuenIoKTt3aW5kb3cuaW1hJiZiJiYKKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LHpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy4kYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuJGM9ITApO3JldHVybiB0aGlzLiRjfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWWIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5UdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsCiEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxUdDpmdW5jdGlvbigpe3RoaXMudWM9ITA7dmFyIGI9dGhpcy5KZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIiwKZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5vZyYmYi5hZHMmJih0aGlzLm9nPWIuYWRzKTtyZXR1cm4gdGhpcy5vZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpOwp0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5CcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlliKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlliKCksdGhpcy51Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOgoodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5abygpfS5iaW5kKHRoaXMpLAoxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxncDpmdW5jdGlvbigpe3RoaXMua3h8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSwKd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlF2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuJHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sJHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5sbnx8eWE7KGZ1bmN0aW9uKGMpe2Mubm49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTsKdmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbT10aGlzLmFbMV07dGhpcy5Qaj10aGlzLmFbMTBdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMuUnA9dGhpcy5hWzJdO3RoaXMuSHA9dGhpcy5hWzJdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMubm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5Daj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY206dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBqOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdjp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnA6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMueHcoYSl9LAp4dzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXc6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5Danx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuYm0oNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTsKcmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sdXQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueWQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCkFhOmZ1bmN0aW9uKCl7dGhpcy5WZSsrO2lmKDEwPHRoaXMuVmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBDYT1jLlJsfHxDYTsoZnVuY3Rpb24oYyl7Yy5RbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9CiEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7CnZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuZnE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLmZxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IudXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBEYT1jLlFsfHxEYTsoZnVuY3Rpb24oYyl7Yy5TbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYKKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlNsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG89dGhpcy5hWzddO3RoaXMuTGk9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzldO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuVXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Lcj1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5MaTp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucm86dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JaTp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLktyfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5Pbyg0KTsoZnVuY3Rpb24oYyl7Yy5Maz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5HZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmCihhPWEucGFyZW50Tm9kZSl9dGhpcy5BdD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQXQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7CnRoaXMubGQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5sZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZwOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmxkKTtlLkZlKHRoaXMubGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuTGt8fEhhOyhmdW5jdGlvbihjKXtjLktrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5HKCEwKX19KX0pKGMpO3ZhciBJYT1jLktrfHxJYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBiPQpsLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5Na3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5qPXRoaXMuYVs0XTt0aGlzLkpvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuVmw9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSm86dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5WbHx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuTWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLm9rPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG51OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sV246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5va3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsCmQsZil7dGhpcy4kYT1hO3RoaXMuQmc9dGhpcy5vaT0hMTt0aGlzLnNoPWQ7dGhpcy5TaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeihhKSk7dmFyIGM9dGhpcy5nYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5JZSh0aGlzLiRhLnVybCkmJm0uT2Qpe3ZhciBlPW5ldyB6KGEudXJsKTtlLm51KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMucGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQmcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuZ2IudXJsQ2FsbGVkPXRoaXMuJGEudXJsO3RyeXt0aGlzLlNoP3RoaXMuZ2Iub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLm9pfHwodGhpcy5nYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJgp0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmdiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5JZSh0aGlzLiRhLnVybCk/bS5PZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkllKHRoaXMuJGEudXJsKSx0aGlzLnNoJiZ0aGlzLnNoKCl9cmV0dXJuIHRoaXMuZ2J9fX0pKGMpO3ZhciBNYT1jLnBrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5XZD0hMX1jLm1qPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3RoaXMuV2Q9YX0scXU6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtCdzoiQWRDbGlja1RocnUiLER3OiJBZEVycm9yIixFdzoiQWRTdG9wcGVkIixIdzoiQWRMaW5lYXJDaGFuZ2UiLEl3OiJBZFRhZ1BhcnNlZCIsTHc6IkFkVmlkZW9Db21wbGV0ZSIsT3c6IkFkTG9hZGVkIixQdzoiQWRTa2lwcGVkIixRdzoiQWRTdGFydGVkIixGdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEd3OiJBZEltcHJlc3Npb24iLEN3OiJBZENyZWF0aXZlVmlldyIsSnc6IkFkVmlkZW9NaWRwb2ludCIsS3c6IkFkUGF1c2VkIixNdzoiQWRWaWRlb1N0YXJ0IixOdzoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmEodGhpcy5XZCxiW2RdKX0sWHQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlZkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlZkKXRoaXMuSGEuVmQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlZkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldkJiZ0aGlzLll0KCk7dGhpcy5IYSYmdGhpcy5YdCgpfX19KShjKTt2YXIgTmE9Yy5tanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPQohMTt0aGlzLnhjPSIiO3RoaXMuamU9dGhpcy53Yz10aGlzLndiPW51bGw7dGhpcy56cD10aGlzLkpiPXRoaXMuamg9ITE7dGhpcy5MYT0iIjt0aGlzLmVoPSExO3RoaXMud2E9dGhpcy5xZD0iIjt0aGlzLiRnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLmFmPSExO3RoaXMucGE9W107dGhpcy5QZz10aGlzLmdjPSIiO3RoaXMucmU9ITE7dGhpcy5zZj0wO3RoaXMuSGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMub2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmljPSIiO3RoaXMuamM9W107dGhpcy5rYz1bXTt0aGlzLktkPVtdO3RoaXMuaGM9IiI7dGhpcy50Zj0KMDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5FYz0hMTt0aGlzLmhwPXRoaXMuUWQ9bnVsbDt0aGlzLk5oPXRoaXMubWM9dGhpcy50Zz10aGlzLndmPXRoaXMuT2Q9dGhpcy5sZT10aGlzLlVjPSExO3RoaXMuaWI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucmQ9MDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuYmQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5QZj0iIn1jLnFrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMueGMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy53YyxhZHRhZ3JlZ2V4OnRoaXMuamUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuamgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuenAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCwKY2xpZW50Q29uZmlnOnRoaXMud2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLiRnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmdjLGhvbWFkQWRwYXRoOnRoaXMuUGcsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5yZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5zZixIT01BRF9WRVJJRklFRDp0aGlzLkhmLEhPTUFEX0JMT0NLRUQ6dGhpcy5GZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5vYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuR2YsdGVzdEhpZGU6dGhpcy5pYyx0ZXN0VGFnczp0aGlzLmpjLHRlc3RUYWdzSlM6dGhpcy5rYyx0ZXN0VGFnc1hIUjp0aGlzLktkLHRlc3RDb29raWU6dGhpcy5oYyx0aHJvdHRsZTp0aGlzLnRmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlVjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMubGUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuT2QsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMud2YsY29uZmlnRmFpbHVyZXM6dGhpcy5pYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5LaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMua2IsdnBhaWQ6dGhpcy5tYyxza2lwQWxsb3dlZDp0aGlzLk5oLHZtYXBzOnRoaXMubGksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLmJkLGFkRmFsbGJhY2tVUkw6dGhpcy5QZn19LFFxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmliKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaWJbYl0mJjE9PXRoaXMuaWJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5IbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkhlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkdjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5LYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnhjfHx0aGlzLndifHx0aGlzLndjfHx0aGlzLmplKSYmKGc9dGhpcy54cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnlxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5HYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sR2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuSGUoYSk7cmV0dXJuIGJ9LHlxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5YdztyZXR1cm4ibm9uZSJ9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5LaF19LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZCgpLGI9dGhpcy5NaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxwaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx3czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5waChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMucGgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx4czpmdW5jdGlvbihhKXt0aGlzLnhjJiYoYSs9dGhpcy54Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMud2MmJihhPXRoaXMud3MoYSx0aGlzLndjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi5ydShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIucXUoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZWg9ITA7dGhpcy5xZD1hO3RoaXMud2E9Yjt0aGlzLmFmPWQ7dGhpcy5RZD1mO3RoaXMuQmM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmhzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuZnMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueWMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLnFkK3RoaXMuZ2UoImdsb2JhbCIpKSx0aGlzLk1xLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LGZzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZ2UoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy55Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGdlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmxlKXt0aGlzLmxlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkJjPSExKTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuJGc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkZmKSk7dGhpcy5OYigpO2UuQ2Moay50dCk7KGI9ZS4kYih0aGlzLnNkKCkpKXx8KGI9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sTXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmdjfHx0aGlzLkxhfHx0aGlzLnljKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHljOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuR2MoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmdjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuUGc9YS5hZHBhdGh8fCIiO3RoaXMucmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5LaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkhjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxIYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLktjKCkpLGQ9dGhpcy56YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMuZ2UoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlJ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjdXN0b21lciIpO2E/dGhpcy55bT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLnltPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5IYyghMCl9LmJpbmQodGhpcyksITApfX0sUnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5FYz0hMDt0aGlzLkhjKCEwKTtyZXR1cm59fXRoaXMuT2Q9dGhpcy5NYihiLnN0cmljdCk7dGhpcy53Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5rYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5LZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy53Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuamU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuamg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubWM7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmNkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5saT1iLnZtYXBzfHwiIjt0aGlzLmJkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5QZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkZxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5yZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy50Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5FYz0hMCx0aGlzLkhjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLktkKT90aGlzLmFmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMubmUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmtkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFBjOmZ1bmN0aW9uKGEpe3RoaXMuVWM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKGEpKSx0aGlzLk5iKCksdGhpcy5uZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmljKXt2YXIgYT1lLmtkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5paCgpKXRoaXMuUGModGhpcy5vYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuV2goKX19ZWxzZSB0aGlzLldoKCl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5wZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuS2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBmKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxXaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVmguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVmgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxwZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMuc2YrKyx0aGlzLkRhKG5ldyB6KHRoaXMuaGMpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMucWYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5UaCgpfSxxZjpmdW5jdGlvbihhKXt0aGlzLlBjKHRoaXMuR2YsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5zZj90aGlzLnBmKCk6dGhpcy5xZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlRoKCk6dGhpcy5xZigiQUFBIil9LFRoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubmUoKX0saWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlVjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmloKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5IZikpO3RoaXMuUWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5RZCYmdGhpcy5RZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMud2YmJnRoaXMuUXEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sJGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEub2k9ITApO3EmJmUuRXIoKSYmKGEuQmc9ITApO2cmJihhLlNoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmJiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5HYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sVXU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmxpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLkl2LmJpbmQodGhpcyksdGhpcy5Idi5iaW5kKHRoaXMpKX0sSXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LEh2OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkNjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG5lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmJiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sa3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sRnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5xa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLmpsPXRoaXMuYVs4XTt0aGlzLk9yPXRoaXMuYVs3XTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLk5wPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuYXE9YjtiLnByb3RvdHlwZT17d2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9yOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXI6dGhpcy5NcChhKX0sTXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5wOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7CnZhciBQYT1jLmFxfHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy53ayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWWcmJmEuZi5ZZyh7cGF1c2U6dGhpcy55ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMudXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLldiPXRoaXMuYWQ9ITE7dGhpcy5Cbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlJvPWUuYWEoMTApOwp0aGlzLm1mPTA7dGhpcy5aYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlpjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLlpjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudGg9dGhpcy5HZD0hMTt0aGlzLm1oPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYmM9ITE7dGhpcy5ycD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SZD0KdGhpcy5PYj10aGlzLnBlPXRoaXMuZ2Q9dGhpcy5JZD10aGlzLnNiPXRoaXMubmM9dGhpcy52aD10aGlzLm1kPXRoaXMubHY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMuc2M9W107dGhpcy5kYz17fTt0aGlzLmp0PTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy54ZD17fX1jLmtrPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5LdSgpO2UudihrLlRuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9CmM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuY3AoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubWgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLkxlKGEsYixjKX0sNTApfX0sV2U6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5tZD0hMTt0aGlzLmM9YTt0aGlzLnd1KHRoaXMuYyk7dGhpcy54ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTWcoYSk7dGhpcy5zYz10aGlzLkRnKGEpO3RoaXMubXAoKX0sTWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSGQ9dGhpcy5JcShhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkRnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuc3EoYSkpKTtyZXR1cm4gY30sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LElxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuamQmJmEuamQuZXJyb3ImJmEuamQuZXJyb3IuY29kZSYmCihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUcuWGQuY29kZT9lLnYoay5kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLk1lKCksYj09Ry5LZi5jb2RlJiZlLnYoay5Gcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5icSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTHUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5JZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTGYuY29kZTplLnYoay5ndyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLmh3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuR3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWGIoYSk7dGhpcy5SYSgpfSxYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9CmEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy4kZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLnd4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuYm8mJnRoaXMucGxheWVyLnZlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci52ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuWG4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLiRlJiZiLmxvYWQoKTtpZih0aGlzLlhoKGIpKXt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLiRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuJGU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm5wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy51dSgpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSx1dTpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiYKdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5hbyh0aGlzLmMub3JpZ2luLnZhKTt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLndoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuTHEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsCmRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmCiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5hYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5zYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVHYoKSx0aGlzLmIuYWMoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuWHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLmF3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT0KYS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlZiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuTC5iZHx8dGhpcy5RYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmCnRoaXMuVXYoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmZjKCkpLHRoaXMuVnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuaGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LFZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuWGMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uYz0hMX0sWHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxXdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxUdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7ZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5tZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7CmUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LCR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTsKZS5vZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sU3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmN3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5taSghMCl9LFhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIiwKYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpOwphLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2J8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5CbykpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5hZCYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLmFkPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5DZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLAp0aGlzLlphKCksITApLHRoaXMuTC50Z3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuTXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuTHYoKTt0aGlzLmhpKCk7dGhpcy5lZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmdkfHx0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZ2R8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLlJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxVbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSXUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmCnRoaXMuYy5TZCYmdGhpcy5Vbih0aGlzLmMuU2QpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5SZHx8KGUudihrLklzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucWMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLldiPXRoaXMuYWQ9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5JZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOgp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxQdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLldiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5hcCgpO3RoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5sdil0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5JZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT0KTWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnB2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi0KYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLldiPXRoaXMuYWQ9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5aYy5yZXBsYWNlKCJbdGltZV0iLAplLkNnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy52aHx8KHRoaXMudmg9ITAsdGhpcy5tZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHB2OmZ1bmN0aW9uKGEpe2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksCnRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5tZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmNpPWEpfSxQaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sS3U6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxMdTpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSwKWGE6ZnVuY3Rpb24oYSl7ZS5NZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5DZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMueGQmJnRoaXMueGQudHJhY2smJnRoaXMueGQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSnEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYKKHRoaXMua2U9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5IZC5pbXByZXNzaW9ucyYmZS5DcihnLnVybCx0aGlzLkhkLmltcHJlc3Npb25zKT90aGlzLktlKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Tbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnhwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09CnR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuV24oYyksZnx8KGY9dGhpcy5zZyksZXx8KGU9dGhpcy5zZyksdGhpcy5ZbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx4cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09CmJ9KX0sTXY6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLk52LmJpbmQodGhpcykpfSxOdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVmImJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sCkx2OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTsKdmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmNkJiYoYj10aGlzLkwuY2QpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmMuaWQ9dGhpcy5ycDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpOwp2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm52LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubXYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjsKYy5hcHBlbmRDaGlsZChmKTt0aGlzLmMubGYmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsCmIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlFlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5uYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSx5ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sbXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LG52OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuZ2R8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5rZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnRofHwhdGhpcy5MLlVjJiYic3BpZWdlbC5kZSIhPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5nZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm5nKCkpOih0aGlzLnRoPXRoaXMuUWM9dGhpcy5EZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmtlPSEwLGE9ZS5kZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5MZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbmc6ZnVuY3Rpb24oYSl7dGhpcy5OdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoITApfS5iaW5kKHRoaXMpLHRoaXMuanQpOih0aGlzLklkPSEwLHRoaXMuYi5CZSgpLHRoaXMuYi5idSgpLHRoaXMuYmM9ITEsCmUudihrLnFwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy54ZSgpLkdoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5WYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnNjJiYwPHRoaXMuc2MubGVuZ3RoJiYoYS5hZElkcz10aGlzLnNjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5SbysiLSIrdGhpcy5tZjt0aGlzLmMmJnRoaXMuYy5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ra3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLm50PXRoaXMuYVsyXTt0aGlzLnV3PXRoaXMuYVs0XTt0aGlzLmNuPXRoaXMuYVs5XTt0aGlzLnVwPXRoaXMuYVs3XTt0aGlzLmtqPXRoaXMuYVsyXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLlVrPXRoaXMuYVs0XTt0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfQpjLnN2PWI7Yi5wcm90b3R5cGU9eyRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hczp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm50OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51dzp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY246dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnVwOnRoaXMuamooYSl9LGpqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Vazp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5zdnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuJHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnJjPXRoaXMudGM9ITE7dGhpcy52YT0iIjt0aGlzLkJmPSExO3RoaXMuVGc9IiI7ZCYmZC5lbXB0eT90aGlzLmxzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2Mua249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUua2QoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnBnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkpkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5rcy5iaW5kKHRoaXMpLAp0aGlzLmdzLmJpbmQodGhpcykpfSxFZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5IcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxIcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGtzOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpOwp0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlRnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sbHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPXRoaXMuRWcoKTt0aGlzLnRjPXRoaXMucmYoKTt0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LGdzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSWYse2RlcHRoOmF9KSl9LEpjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuSnIoKT90aGlzLmZ2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTmcoKSxoLHtBZFN5c3RlbTp0aGlzLnJxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5MZikpOihhPTAsdGhpcy5EdigpJiZ0aGlzLldlKHRoaXMuc3AoKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMudGM/KHRoaXMudGM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQuUmUoKX0scWg6ZnVuY3Rpb24oKXt0aGlzLnJjPyh0aGlzLnJjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LnFoKCl9LER2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3YoKT90aGlzLmJ2KCk/ITA6KC0xIT10aGlzLkRjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVGQpKTp0aGlzLnNhKHRoaXMuU2Eody5FZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuU2MsRy5LZikpLCExKX0sV2U6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuU2R8fChhLlNkPVtdKTthLlNkLnB1c2godGhpcy5UZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk5lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnRjO2EucWM9YS5xYz9hLnFjOnRoaXMucmM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMucGFyZW50LldlKGEpfSxzcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkRjKCk7YS5PPXRoaXMuS2coKTthLlZiPXRoaXMudHEoKTthLkt2PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMucXEoKTthLmxmPXRoaXMuSHEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMudXEoKSk6Yi5QYS5jb25jYXQodGhpcy5DcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LlhiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuWGImJnRoaXMucGFyZW50LlhiKGIpLGE9MCx0aGlzLkpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sWGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuWGIoYSl9LHVnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGZ2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sY3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxidjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuRGMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVWg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnJmKCkmJihhPSEwKTtyZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEpyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuYWgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSx1cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sS2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksWXc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucGQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxEYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5IdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5rbnx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5acT10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLkh0PWI7Yi5wcm90b3R5cGU9e1lxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWnE6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuSHR8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLllxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuVmI9IiI7dGhpcy5CPXRoaXMucWM9dGhpcy50Yj0hMTt0aGlzLkNlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5EZT0iIn1jLmRtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LEFxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLApiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLkFxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5EZT1hfSxMcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuZG18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVs0XTt0aGlzLnFsPXRoaXMuYVs5XTt0aGlzLkVpPXRoaXMuYVsxMF07dGhpcy5icj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlNrPQpiO2IucHJvdG90eXBlPXtwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Ta3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMucHQoNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsCk9hOiJEVVJBVElPTl9FUlJPUiJ9LFNjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LExmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx6dzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LEF3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmRyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuaXI9YjtiLnByb3RvdHlwZT17Y3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5pcnx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuY3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5lcnJvcj1hO3RoaXMuamQ9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Taj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuU2p8fFVhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJqPXRoaXMuYVszXTt0aGlzLlNyPXRoaXMuYVs1XTt0aGlzLldrPXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNF07dGhpcy52cj10aGlzLmFbNV07dGhpcy5jcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5abD1iO2IucHJvdG90eXBlPXtBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5ScihhKX0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNyOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xazp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy51cihhKX0sCnVyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52cjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLlpsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Baig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5Pdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLm9sPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLnN4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlJ0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxvdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy52cShhKSl9fSx2cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntCeDohMCxBeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntveDoidmlkZW8iLER4OiJqc0N1c3RvbSIsRXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRng6MSxadzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEtxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5vdDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLktxKGIpLHZlbmRvcjpifSk7CnRoaXMuSnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk92Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxWbzpiLHl4OiExfSl9LEp1OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Gcnx8KGEucngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5vbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzVdO3RoaXMuam09dGhpcy5hWzJdO3RoaXMuWG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzEwXX1jLnBqPWI7Yi5wcm90b3R5cGU9e0VrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gazp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5wanx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuRWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXtwcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnBxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5WcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUXU6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZmQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFZxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxpcTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnFqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLlVvPXRoaXMuYVs2XTt0aGlzLkNpPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuY3U9YjtiLnByb3RvdHlwZT17ZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5lbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW86dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuJGwoYSl9LCRsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuY3V8fGJiLExjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmRuKDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSwKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSwKRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuSmx8fGNiOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPQohMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLmdxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5iYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmRkKCk7dGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sCmtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxMZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxnZzpmdW5jdGlvbigpe2lmKHRoaXMuZGQoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTsKdGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuV3d9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSwkdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5teCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuRGMoKTotMX0sRHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sZ3E6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksCjEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5EcShiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLklsfHxkYjsoZnVuY3Rpb24oYyl7Yy5LbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEdyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmhtLkpuLkhuP3dpbmRvdy5PTy5obS5Kbi5Ibi5VdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPQpkYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLktsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzhdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLlR1PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLmd1PWI7Yi5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QbDp0aGlzLmtxKGEpfSwKa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxxOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5UdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuZ3V8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLk9sKDQpOyhmdW5jdGlvbihjKXtjLllpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2coKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSwKemg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLllpfHxoYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5oZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLlhpfHxpYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5EZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksCnRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuaHF8fCh0aGlzLmhxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuQ2god2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLlppfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdD0KdGhpcy5hWzEwXTt0aGlzLlpwPXRoaXMuYVsxMF07dGhpcy5aaj10aGlzLmFbNF07dGhpcy5Tcz10aGlzLmFbMl07dGhpcy5ndD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLkRqPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnA6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpqOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tczp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkRqfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TmMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSwKTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLkxtfHxVOyhmdW5jdGlvbihjKXtjLkttPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTnMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlBxKCl9LE5zOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLkttfHxWOyhmdW5jdGlvbihjKXtjLk1tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPQpbXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy53ZCYmKGI9ZS55cChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksCnRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFljOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LGd2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5hdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSwKUHE6ZnVuY3Rpb24oKXtpZih0aGlzLkljKWZvcih2YXIgYj0wO2I8dGhpcy5JYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkljW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5ndihiKX19KX0pKGMpO3ZhciBsYj1jLk1tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Ncz10aGlzLmFbNV07dGhpcy5Vaj10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbMl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy54cj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5IbD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5xcj1iO2IucHJvdG90eXBlPXtMczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXM6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVqOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sazp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpvOnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHI6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnFuOnRoaXMua28oYSl9LGtvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sbzp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnFyfHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5Mcyg0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHwKb2I7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5XaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVsPXRoaXMuYVs5XTt0aGlzLkFvPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsyXTt0aGlzLld1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLk5pPXRoaXMuYVszXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuTm09YjtiLnByb3RvdHlwZT17dGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnVsOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbzp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc3Q6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLld1OnRoaXMua3QoYSl9LAprdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubHQ6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5OaTp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSms6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuTm18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnRsKDQpOyhmdW5jdGlvbihjKXtjLndsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVyhiKTt0aGlzLlooYSk7dGhpcy5RdCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLm11dGUmJnRoaXMuamEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxZZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLndsfHxzYjsoZnVuY3Rpb24oYyl7Yy52bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmCiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm9hKCkpO2EuS2EoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIHRiPWMudmx8fHRiOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMueGx8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy53aj10aGlzLmFbMV07dGhpcy5qaz10aGlzLmFbMl07dGhpcy5zbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLlNtPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2o6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmprOnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU218fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmdqKDQpOwooZnVuY3Rpb24oYyl7Yy53bj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LApOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLndufHx3YjsoZnVuY3Rpb24oYyl7Yy52bj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sT3Q6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj0KW10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudWM9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5PdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpOwpyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnZufHx4YjsoZnVuY3Rpb24oYyl7Yy54bj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7CnRoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLnhufHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG09dGhpcy5hWzZdO3RoaXMuS3M9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy54aj1iO2IucHJvdG90eXBlPXtDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lczp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy54anx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkNtKDQpOyhmdW5jdGlvbihjKXtjLndtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy52dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LE11OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMud218fEJiOyhmdW5jdGlvbihjKXtjLnZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ycz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5ycz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMudm18fENiOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMueG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbMl07dGhpcy51bT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmlqPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbzp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmlqfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuRG8oNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5wbXx8R2I7KGZ1bmN0aW9uKGMpe2Mub209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLm9kKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5acigpOnRoaXMuamcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuU2YoKXx8dGhpcy5tKCEwKX0sWnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5UdyYmYi5WdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMub2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0sb2Q6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LApueDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5vZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLm9tfHxIYjsoZnVuY3Rpb24oYyl7Yy5xbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMucW18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMTBdO3RoaXMueHQ9dGhpcy5hWzNdO3RoaXMuc2o9dGhpcy5hWzldO3RoaXMud3A9dGhpcy5hWzldO3RoaXMuQmw9dGhpcy5hWzddO3RoaXMuRm09dGhpcy5hWzZdO3RoaXMuUHA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy53bz1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnh0OnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLndwOnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbDp0aGlzLkVtKGEpfSxFbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRm06dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy53b3x8S2IsVGM9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuV3AoNCk7KGZ1bmN0aW9uKGMpe2MubGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sbHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sS2E6ZnVuY3Rpb24oKXt2YXIgYjtIPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPWMubGx8fFg7KGZ1bmN0aW9uKGMpe2Mua2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5ZZSYmYiE9dGhpcy5ZZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLmZhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS50eCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMua2x8fFk7KGZ1bmN0aW9uKGMpe2MubWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0g9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihIKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMubWx8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpsPXRoaXMuYVs1XTt0aGlzLm9yPXRoaXMuYVsxXTt0aGlzLkxqPXRoaXMuYVsxMF07dGhpcy5lbz10aGlzLmFbOV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5qdj10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbM107dGhpcy5Hbj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs0XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3lsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3I6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Majp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZW86dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFpOnRoaXMuaXYoYSl9LGl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuanY6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnJyfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy5naz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApodTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0scXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5na3x8T2I7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5ma3x8UGI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTsKaWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5oa3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLmF0PWI7Yi5wcm90b3R5cGU9e1ZzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Xczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMuYXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5Wcyg0KTsoZnVuY3Rpb24oYyl7Yy5Cbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxOZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sClB0OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlJjJiYodGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJjPSExKSx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksCiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuQm58fFRiOyhmdW5jdGlvbihjKXtjLkFuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksCmImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE9mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pOwp0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLlN0KCl9LFN0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYil7dGhpcy5VYihiKX0pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuTnQ9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5Bbnx8VWI7CihmdW5jdGlvbihjKXtjLkNuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuUHQoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLkNufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJrPXRoaXMuYVsxMF07dGhpcy55aT10aGlzLmFbNF07dGhpcy5SbT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLiRqPWI7Yi5wcm90b3R5cGU9e0FrOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuQms6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuJGp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkFrKDQpOyhmdW5jdGlvbihjKXtjLiRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuRHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGh1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Ec30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYodGhpcy54aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuJG18fE87KGZ1bmN0aW9uKGMpe2MuWm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy50dSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuWm18fFA7KGZ1bmN0aW9uKGMpe2MuYW49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYW58fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5PcT10aGlzLmFbMl07dGhpcy5SaT10aGlzLmFbM107dGhpcy5mbD10aGlzLmFbMV07dGhpcy5rcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLm5sPWI7Yi5wcm90b3R5cGU9e05xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmk6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ubHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuTnEoNCk7KGZ1bmN0aW9uKGMpe2MuWWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Za3x8WjsoZnVuY3Rpb24oYyl7Yy5Yaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLlhrfHxhYTsoZnVuY3Rpb24oYyl7Yy5aaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLlprfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGo9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtjajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLk9zfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5jaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5ia3x8ZGM7KGZ1bmN0aW9uKGMpe2MuYWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5ha3x8ZWM7KGZ1bmN0aW9uKGMpe2MuY2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLmNrfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmw9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuWHE9CnRoaXMuYVsxXTt0aGlzLllzPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs0XTt0aGlzLnRzPXRoaXMuYVsxXTt0aGlzLkVuPXRoaXMuYVsxMF07dGhpcy5HdD10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbNV07dGhpcy56cz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLnR2PWI7Yi5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemo6dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhxOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zczp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSGs6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRzOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Fbjp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLkd0OnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5KbTp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnR2fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hbCg0KTsoZnVuY3Rpb24oYyl7Yy5yaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubWUoKTt0aGlzLmZnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LApFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwOwppZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfSxtZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJgpiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD8KdGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzddO3RoaXMuQ3Y9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMuRmo9dGhpcy5hWzEwXTt0aGlzLnd3PXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVs5XTt0aGlzLnVuPXRoaXMuYVs0XTt0aGlzLkhtPXRoaXMuYVszXTt0aGlzLlBpPXRoaXMuYVs0XTt0aGlzLmxtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQXM9YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJqOnRoaXMuQnYoYSl9LEJ2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnl1Ogp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy52dyhhKX0sdnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnd3OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW46dGhpcy5HbShhKX0sR206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IbTp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5Bc3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuYWooNCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuZm09YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5FcShhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLAp0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMuemQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0sT3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMuemQubGVuZ3RoO2ErKyl0aGlzLnpkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5mbXx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs5XTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLlVsPXRoaXMuYVs2XTt0aGlzLllyPXRoaXMuYVs3XTt0aGlzLlVxPXRoaXMuYVs2XTt0aGlzLkx0PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs0XTt0aGlzLkdpPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLmpxPWI7Yi5wcm90b3R5cGU9e3lrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56azp0aGlzLnVvKGEpfSx1bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudm86dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVsOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zcjp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5MdDp0aGlzLldsKGEpfSxXbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhsOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuanF8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLnlrKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoKIiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLkV2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLkhzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7dmFyIEk9bmV3IEosbD0hMTtJLmthKCk7CkkuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnRyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbMTBdO3RoaXMuc209dGhpcy5hWzEwXTt0aGlzLlVzPXRoaXMuYVsxXTt0aGlzLmduPXRoaXMuYVsxMF07dGhpcy5CbT10aGlzLmFbOF07dGhpcy5zdz10aGlzLmFbN107dGhpcy5ldT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlFvPWI7Yi5wcm90b3R5cGU9e3RrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51azp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNtOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vczp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMucncoYSl9LHJ3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdzp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlFvfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9Cm51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnZpPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihhKXt0aGlzLm5iPWF9LGp1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLnlyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsdGhpcy5uYi53YSx0aGlzLm5iLmFmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMubmIuQmMpO2Vsc2UgaWYodGhpcy5ScSgpKXRoaXMuZnUoZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuUXUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7ClI9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuaXUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnFzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihjPXRoaXMucGxheWVyLkplKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsYyxmKTt0aGlzLnBsYXllci5MaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy51ZC5nZXRUaW1lKCksdGhpcy51ZD1hLDNFNTxiPyEwOiExO3RoaXMudWQ9YTtyZXR1cm4hMX0sRXU6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7CmUuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfSxEdTpmdW5jdGlvbihhKXtpZighdGhpcy55aCl7ZS5nZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMucHUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLAohMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LFZ0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIudnUodGhpcy5EdS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxGZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS5nZigibWlkcm9sbCIpO2lmKCF0aGlzLm5oKXt0aGlzLm5oPSEwO3ZhciBiPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksCnRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LFV0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIub3UodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5FdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLlV0KCk7dGhpcy5WdCgpfSxXdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5pdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQmQ9dGhpcy5BZC5sZW5ndGh9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9CiExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxmdTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRHQuYmluZCh0aGlzKSl9LER0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxxczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9dGhpcy5aZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy52aXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcz10aGlzLmFbMV07dGhpcy5VbT10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbNl07dGhpcy4kcz10aGlzLmFbM107dGhpcy5zbj10aGlzLmFbOF07CnRoaXMuZWs9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbM119Yy56bj1iO2IucHJvdG90eXBlPXtCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51aTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuJHM6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuem58fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkJzKDQpfSkuY2FsbChLdXRhZWNoZWRpZVBvWWFpLApLdXRhZWNoZWRpZVBvWWFpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.224.196.120
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-13-224-196-120.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
|
GET
H2
|
200
|
impl_v54.js
Show response
www.googletagservices.com/dcm/
Frame 67BD
|
21 KB
9 KB
|
11ms
11ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
54ms
53ms
|
XHR
application/json |
2.21.37.179
AKAMAI-ASN1
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=2deb466b-cb5b-4a18-b149-748b53f3323a&formatVersion=2.22.61&env=js-web&netBw=9.2&ttfb=98
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.21.37.179
, France,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a2-21-37-179.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
62ms
62ms
|
XHR
application/json |
2.21.37.179
AKAMAI-ASN1
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=2deb466b-cb5b-4a18-b149-748b53f3323a&formatVersion=2.22.61&env=js-web&netBw=9.2&ttfb=98
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.21.37.179
, France,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a2-21-37-179.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/9575ac68ad679a27015bb6c8bea9ae9a2f4cf6aa/
Frame 4158
|
653 B
1 KB
|
2102ms
47ms
|
XHR
application/json |
136.243.244.75
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/9575ac68ad679a27015bb6c8bea9ae9a2f4cf6aa/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEt1dGFlY2hlZGllUG9ZYWk9S3V0YWVjaGVkaWVQb1lhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5TbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5rdShtKTthLmp1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5zdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3I9dGhpcy5hWzddO3RoaXMub2o9dGhpcy5hWzNdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuSGo9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzddO3RoaXMuRGw9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzEwXTt0aGlzLkJwPXRoaXMuYVszXTt0aGlzLlJqPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMucHM9YjtiLnByb3RvdHlwZT17VnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53djp0aGlzLkdqKGEpfSwKR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkhqOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Objp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnA6dGhpcy5DbChhKX0sQ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRsOnRoaXMubnMoYSl9LG5zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5vczp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnA6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5wc3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuVnIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuU289CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk9jPVtdO3RoaXMub2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5DdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuU2c9e307dGhpcy5lZj0hMX1jLm1rPWI7Yi5wcm90b3R5cGU9e1B1OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWmI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5TZ1thXSYmKHRoaXMuU2dbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5QdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxhbzpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sQ3Q6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuQnQoYS5kYXRhKX0sQnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0saGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0scGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5IZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMua2goYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEhnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxabjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUubXEoYSkpcmV0dXJuOyhiPXRoaXMucGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxtcTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LElyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHllOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sR2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG9mOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxHZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LEVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwkaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwkcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxMbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx5bjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmNsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxDbzpmdW5jdGlvbigpe3JldHVybiBhLkppKCl8fGEuJGkoKXx8YS4kcSgpfHxhLkxsKCl8fGEueW4oKXx8YS5jbCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5DbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LCRiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LEdxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx5cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxIdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxDZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuZGkoYikrIjoiK3RoaXMuZGkoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxnZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHpnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5lZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LENjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy56ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkNjKEIpfSxFdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkdxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sSXU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlpiKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5lZShhKX0sZWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uS2MoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLktjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LE1kOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uS2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTWU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uYnAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSw1MDApfSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5IZShhKXx8dGhpcy5JcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmRmJiZ3aW5kb3cuc2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnhnKGEpKXJldHVybiB0aGlzLnhnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5abihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LGpzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmtoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGxoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5qcyhmLnNkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuT2M9YX0saXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEhvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5ta3x8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMubGs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi50dD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Hcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmJxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ZZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5RZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlZmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlpmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Sbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5UZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5jcT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmZkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuemM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlhmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Ubj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlhjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5hZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5jZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuU249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmtpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuSXM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi52ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5jdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuSHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmxrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp0PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbNV07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy5HdT10aGlzLmFbNF07dGhpcy5McD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLllsPWI7Yi5wcm90b3R5cGU9e3l0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56dDp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVzOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zazp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdvOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HdTp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTHA6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5ZbHx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMueXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5uaz1iO2IucHJvdG90eXBlPXtBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCsKbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxCcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxuZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubmQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5uZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPQphLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxrYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMubGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sdHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkJxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubmQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMubmt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmhsPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs3XTt0aGlzLnF3PXRoaXMuYVs5XTt0aGlzLkN1PXRoaXMuYVs0XTt0aGlzLkF1PXRoaXMuYVsxMF07dGhpcy5pdD10aGlzLmFbNl07dGhpcy5mdz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs2XX1jLnByPWI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5obDp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXI6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF3OnRoaXMuQnUoYSl9LEJ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5DdTp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQXU6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml0OnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLnByfHxrYSx3Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5nbCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PQp0eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MubGo9Yn0pKGMpO3ZhciBMPWMubGp8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnY9dGhpcy5hWzJdO3RoaXMudnM9dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMV19Yy4kcD1iO2IucHJvdG90eXBlPXtxdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnY6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ocjp0aGlzLlZtKGEpfSwKVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLldtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy4kcHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMucXYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5lbT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5sdShiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLAp0aGlzLkxjKSl9LGF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0senE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0uT3UoYil9LGZ4OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxEcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHh4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09Cm51bGx9fSl9KShjKTt2YXIgdD1jLmVtfHx0OyhmdW5jdGlvbihjKXtjLmdtPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSx2dTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxvdTpmdW5jdGlvbihiKXt0aGlzLlBlPQpifSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSwKRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSx6eDpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5TcSgpfHx0aGlzLlZuKCk7dGhpcy5EZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LFZuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJgpiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LGp4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSx1eDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYXg6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZ218fHA7KGZ1bmN0aW9uKGMpe2Mud2k9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy5Jbj0iMyI7dGhpcy5UYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdOwp0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5tdShhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHNyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldPwp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnNyKCk7aWYoIXRoaXMuQXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksCnRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sCnc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LHR1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Jbn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sUnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlRjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LG11OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx6cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LG1zOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy53aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUW49dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzZdO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMudms9YjtiLnByb3RvdHlwZT17UG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFuOnRoaXMuQ3AoYSl9LENwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EcDp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy52a3x8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuUG4oNCk7KGZ1bmN0aW9uKGMpe2MuVmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuVmp8fG9hOyhmdW5jdGlvbihjKXtjLldqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5TdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0KITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgcGE9Yy5Xanx8cGE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuWGp8fHFhOyhuZXcgcWEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UcD10aGlzLmFbOF07dGhpcy5UaT10aGlzLmFbMl07dGhpcy5Mbj10aGlzLmFbMl07dGhpcy5ubT10aGlzLmFbNF07dGhpcy55bz0KdGhpcy5hWzVdO3RoaXMuUXI9dGhpcy5hWzddO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuTm89dGhpcy5hWzVdO3RoaXMuTmw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5odj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHA6dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRpOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5tOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueW86dGhpcy5QcihhKX0sUHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFyOnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sdzp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5NbyhhKX0sCk1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmh2fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5TcCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3RoaXMud2coKTt0aGlzLnlnKCk7dGhpcy5wcD0hMX0sd2c6ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5jYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj0KYi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuY2M9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmCnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiYKYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sCnVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Pa3x8c2E7KGZ1bmN0aW9uKGMpe2MuTms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmCihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5WYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJgpiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS55ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuVmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5vaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLldjLmluZGV4T2YoYSkmJgp0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5XYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sbXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2Uub2YoYS52aWRlb1RhZyk/YS5jYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlZjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Oa3x8dGE7KGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy53cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkRyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCndxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Qa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLm9xPXRoaXMuYVszXTt0aGlzLm93PXRoaXMuYVszXTt0aGlzLmxwPXRoaXMuYVs3XTt0aGlzLnl2PXRoaXMuYVs4XTt0aGlzLkpwPXRoaXMuYVszXTt0aGlzLnRvPXRoaXMuYVsyXTt0aGlzLlltPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLiRrPWI7Yi5wcm90b3R5cGU9e0VsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GbDp0aGlzLm5xKGEpfSxucTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3E6dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm93OnRoaXMua3AoYSl9LAprcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHA6dGhpcy54dihhKX0seHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnl2OnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcDp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG86dGhpcy5YbShhKX0sWG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlltOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy4ka3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MubW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZmk9ITA7dGhpcy51Yz10aGlzLldnPSExO3RoaXMuRXMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnJoKCksdGhpcy5ZbygpLHRoaXMucmIoKSl9LEVzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LHZ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwKIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT8KYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwKIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5pZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sClliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxKZzpmdW5jdGlvbigpe2lmKCF0aGlzLkZjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LEJyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuenIoKTt3aW5kb3cuaW1hJiZiJiYKKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LHpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy4kYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuJGM9ITApO3JldHVybiB0aGlzLiRjfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWWIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5UdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsCiEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxUdDpmdW5jdGlvbigpe3RoaXMudWM9ITA7dmFyIGI9dGhpcy5KZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIiwKZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5vZyYmYi5hZHMmJih0aGlzLm9nPWIuYWRzKTtyZXR1cm4gdGhpcy5vZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpOwp0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5CcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlliKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlliKCksdGhpcy51Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOgoodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5abygpfS5iaW5kKHRoaXMpLAoxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxncDpmdW5jdGlvbigpe3RoaXMua3h8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSwKd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlF2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuJHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sJHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5sbnx8eWE7KGZ1bmN0aW9uKGMpe2Mubm49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTsKdmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbT10aGlzLmFbMV07dGhpcy5Qaj10aGlzLmFbMTBdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMuUnA9dGhpcy5hWzJdO3RoaXMuSHA9dGhpcy5hWzJdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMubm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5Daj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY206dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBqOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdjp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnA6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMueHcoYSl9LAp4dzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXc6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5Danx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuYm0oNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTsKcmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sdXQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueWQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCkFhOmZ1bmN0aW9uKCl7dGhpcy5WZSsrO2lmKDEwPHRoaXMuVmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBDYT1jLlJsfHxDYTsoZnVuY3Rpb24oYyl7Yy5RbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9CiEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7CnZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuZnE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLmZxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IudXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBEYT1jLlFsfHxEYTsoZnVuY3Rpb24oYyl7Yy5TbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYKKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlNsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG89dGhpcy5hWzddO3RoaXMuTGk9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzldO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuVXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Lcj1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5MaTp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucm86dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JaTp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLktyfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5Pbyg0KTsoZnVuY3Rpb24oYyl7Yy5Maz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5HZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmCihhPWEucGFyZW50Tm9kZSl9dGhpcy5BdD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQXQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7CnRoaXMubGQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5sZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZwOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmxkKTtlLkZlKHRoaXMubGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuTGt8fEhhOyhmdW5jdGlvbihjKXtjLktrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5HKCEwKX19KX0pKGMpO3ZhciBJYT1jLktrfHxJYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBiPQpsLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5Na3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5qPXRoaXMuYVs0XTt0aGlzLkpvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuVmw9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSm86dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5WbHx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuTWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLm9rPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG51OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sV246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5va3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsCmQsZil7dGhpcy4kYT1hO3RoaXMuQmc9dGhpcy5vaT0hMTt0aGlzLnNoPWQ7dGhpcy5TaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeihhKSk7dmFyIGM9dGhpcy5nYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5JZSh0aGlzLiRhLnVybCkmJm0uT2Qpe3ZhciBlPW5ldyB6KGEudXJsKTtlLm51KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMucGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQmcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuZ2IudXJsQ2FsbGVkPXRoaXMuJGEudXJsO3RyeXt0aGlzLlNoP3RoaXMuZ2Iub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLm9pfHwodGhpcy5nYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJgp0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmdiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5JZSh0aGlzLiRhLnVybCk/bS5PZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkllKHRoaXMuJGEudXJsKSx0aGlzLnNoJiZ0aGlzLnNoKCl9cmV0dXJuIHRoaXMuZ2J9fX0pKGMpO3ZhciBNYT1jLnBrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5XZD0hMX1jLm1qPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3RoaXMuV2Q9YX0scXU6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtCdzoiQWRDbGlja1RocnUiLER3OiJBZEVycm9yIixFdzoiQWRTdG9wcGVkIixIdzoiQWRMaW5lYXJDaGFuZ2UiLEl3OiJBZFRhZ1BhcnNlZCIsTHc6IkFkVmlkZW9Db21wbGV0ZSIsT3c6IkFkTG9hZGVkIixQdzoiQWRTa2lwcGVkIixRdzoiQWRTdGFydGVkIixGdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEd3OiJBZEltcHJlc3Npb24iLEN3OiJBZENyZWF0aXZlVmlldyIsSnc6IkFkVmlkZW9NaWRwb2ludCIsS3c6IkFkUGF1c2VkIixNdzoiQWRWaWRlb1N0YXJ0IixOdzoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmEodGhpcy5XZCxiW2RdKX0sWHQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlZkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlZkKXRoaXMuSGEuVmQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlZkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldkJiZ0aGlzLll0KCk7dGhpcy5IYSYmdGhpcy5YdCgpfX19KShjKTt2YXIgTmE9Yy5tanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPQohMTt0aGlzLnhjPSIiO3RoaXMuamU9dGhpcy53Yz10aGlzLndiPW51bGw7dGhpcy56cD10aGlzLkpiPXRoaXMuamg9ITE7dGhpcy5MYT0iIjt0aGlzLmVoPSExO3RoaXMud2E9dGhpcy5xZD0iIjt0aGlzLiRnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLmFmPSExO3RoaXMucGE9W107dGhpcy5QZz10aGlzLmdjPSIiO3RoaXMucmU9ITE7dGhpcy5zZj0wO3RoaXMuSGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMub2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmljPSIiO3RoaXMuamM9W107dGhpcy5rYz1bXTt0aGlzLktkPVtdO3RoaXMuaGM9IiI7dGhpcy50Zj0KMDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5FYz0hMTt0aGlzLmhwPXRoaXMuUWQ9bnVsbDt0aGlzLk5oPXRoaXMubWM9dGhpcy50Zz10aGlzLndmPXRoaXMuT2Q9dGhpcy5sZT10aGlzLlVjPSExO3RoaXMuaWI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucmQ9MDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuYmQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5QZj0iIn1jLnFrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMueGMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy53YyxhZHRhZ3JlZ2V4OnRoaXMuamUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuamgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuenAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCwKY2xpZW50Q29uZmlnOnRoaXMud2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLiRnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmdjLGhvbWFkQWRwYXRoOnRoaXMuUGcsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5yZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5zZixIT01BRF9WRVJJRklFRDp0aGlzLkhmLEhPTUFEX0JMT0NLRUQ6dGhpcy5GZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5vYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuR2YsdGVzdEhpZGU6dGhpcy5pYyx0ZXN0VGFnczp0aGlzLmpjLHRlc3RUYWdzSlM6dGhpcy5rYyx0ZXN0VGFnc1hIUjp0aGlzLktkLHRlc3RDb29raWU6dGhpcy5oYyx0aHJvdHRsZTp0aGlzLnRmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlVjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMubGUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuT2QsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMud2YsY29uZmlnRmFpbHVyZXM6dGhpcy5pYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5LaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMua2IsdnBhaWQ6dGhpcy5tYyxza2lwQWxsb3dlZDp0aGlzLk5oLHZtYXBzOnRoaXMubGksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLmJkLGFkRmFsbGJhY2tVUkw6dGhpcy5QZn19LFFxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmliKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaWJbYl0mJjE9PXRoaXMuaWJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5IbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkhlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkdjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5LYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnhjfHx0aGlzLndifHx0aGlzLndjfHx0aGlzLmplKSYmKGc9dGhpcy54cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnlxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5HYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sR2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuSGUoYSk7cmV0dXJuIGJ9LHlxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5YdztyZXR1cm4ibm9uZSJ9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5LaF19LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZCgpLGI9dGhpcy5NaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxwaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx3czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5waChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMucGgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx4czpmdW5jdGlvbihhKXt0aGlzLnhjJiYoYSs9dGhpcy54Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMud2MmJihhPXRoaXMud3MoYSx0aGlzLndjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi5ydShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIucXUoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZWg9ITA7dGhpcy5xZD1hO3RoaXMud2E9Yjt0aGlzLmFmPWQ7dGhpcy5RZD1mO3RoaXMuQmM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmhzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuZnMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueWMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLnFkK3RoaXMuZ2UoImdsb2JhbCIpKSx0aGlzLk1xLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LGZzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZ2UoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy55Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGdlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmxlKXt0aGlzLmxlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkJjPSExKTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuJGc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkZmKSk7dGhpcy5OYigpO2UuQ2Moay50dCk7KGI9ZS4kYih0aGlzLnNkKCkpKXx8KGI9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sTXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmdjfHx0aGlzLkxhfHx0aGlzLnljKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHljOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuR2MoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmdjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuUGc9YS5hZHBhdGh8fCIiO3RoaXMucmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5LaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkhjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxIYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLktjKCkpLGQ9dGhpcy56YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMuZ2UoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlJ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjdXN0b21lciIpO2E/dGhpcy55bT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLnltPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5IYyghMCl9LmJpbmQodGhpcyksITApfX0sUnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5FYz0hMDt0aGlzLkhjKCEwKTtyZXR1cm59fXRoaXMuT2Q9dGhpcy5NYihiLnN0cmljdCk7dGhpcy53Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5rYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5LZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy53Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuamU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuamg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubWM7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmNkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5saT1iLnZtYXBzfHwiIjt0aGlzLmJkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5QZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkZxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5yZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy50Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5FYz0hMCx0aGlzLkhjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLktkKT90aGlzLmFmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMubmUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmtkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFBjOmZ1bmN0aW9uKGEpe3RoaXMuVWM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKGEpKSx0aGlzLk5iKCksdGhpcy5uZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmljKXt2YXIgYT1lLmtkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5paCgpKXRoaXMuUGModGhpcy5vYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuV2goKX19ZWxzZSB0aGlzLldoKCl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5wZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuS2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBmKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxXaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVmguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVmgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxwZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMuc2YrKyx0aGlzLkRhKG5ldyB6KHRoaXMuaGMpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMucWYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5UaCgpfSxxZjpmdW5jdGlvbihhKXt0aGlzLlBjKHRoaXMuR2YsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5zZj90aGlzLnBmKCk6dGhpcy5xZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlRoKCk6dGhpcy5xZigiQUFBIil9LFRoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubmUoKX0saWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlVjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmloKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5IZikpO3RoaXMuUWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5RZCYmdGhpcy5RZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMud2YmJnRoaXMuUXEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sJGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEub2k9ITApO3EmJmUuRXIoKSYmKGEuQmc9ITApO2cmJihhLlNoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmJiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5HYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sVXU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmxpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLkl2LmJpbmQodGhpcyksdGhpcy5Idi5iaW5kKHRoaXMpKX0sSXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LEh2OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkNjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG5lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmJiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sa3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sRnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5xa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLmpsPXRoaXMuYVs4XTt0aGlzLk9yPXRoaXMuYVs3XTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLk5wPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuYXE9YjtiLnByb3RvdHlwZT17d2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9yOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXI6dGhpcy5NcChhKX0sTXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5wOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7CnZhciBQYT1jLmFxfHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy53ayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWWcmJmEuZi5ZZyh7cGF1c2U6dGhpcy55ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMudXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLldiPXRoaXMuYWQ9ITE7dGhpcy5Cbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlJvPWUuYWEoMTApOwp0aGlzLm1mPTA7dGhpcy5aYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlpjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLlpjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudGg9dGhpcy5HZD0hMTt0aGlzLm1oPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYmM9ITE7dGhpcy5ycD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SZD0KdGhpcy5PYj10aGlzLnBlPXRoaXMuZ2Q9dGhpcy5JZD10aGlzLnNiPXRoaXMubmM9dGhpcy52aD10aGlzLm1kPXRoaXMubHY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMuc2M9W107dGhpcy5kYz17fTt0aGlzLmp0PTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy54ZD17fX1jLmtrPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5LdSgpO2UudihrLlRuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9CmM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuY3AoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubWgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLkxlKGEsYixjKX0sNTApfX0sV2U6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5tZD0hMTt0aGlzLmM9YTt0aGlzLnd1KHRoaXMuYyk7dGhpcy54ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTWcoYSk7dGhpcy5zYz10aGlzLkRnKGEpO3RoaXMubXAoKX0sTWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSGQ9dGhpcy5JcShhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkRnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuc3EoYSkpKTtyZXR1cm4gY30sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LElxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuamQmJmEuamQuZXJyb3ImJmEuamQuZXJyb3IuY29kZSYmCihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUcuWGQuY29kZT9lLnYoay5kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLk1lKCksYj09Ry5LZi5jb2RlJiZlLnYoay5Gcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5icSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTHUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5JZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTGYuY29kZTplLnYoay5ndyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLmh3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuR3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWGIoYSk7dGhpcy5SYSgpfSxYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9CmEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy4kZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLnd4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuYm8mJnRoaXMucGxheWVyLnZlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci52ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuWG4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLiRlJiZiLmxvYWQoKTtpZih0aGlzLlhoKGIpKXt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLiRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuJGU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm5wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy51dSgpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSx1dTpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiYKdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5hbyh0aGlzLmMub3JpZ2luLnZhKTt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLndoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuTHEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsCmRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmCiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5hYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5zYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVHYoKSx0aGlzLmIuYWMoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuWHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLmF3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT0KYS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlZiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuTC5iZHx8dGhpcy5RYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmCnRoaXMuVXYoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmZjKCkpLHRoaXMuVnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuaGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LFZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuWGMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uYz0hMX0sWHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxXdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxUdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7ZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5tZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7CmUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LCR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTsKZS5vZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sU3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmN3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5taSghMCl9LFhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIiwKYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpOwphLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2J8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5CbykpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5hZCYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLmFkPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5DZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLAp0aGlzLlphKCksITApLHRoaXMuTC50Z3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuTXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuTHYoKTt0aGlzLmhpKCk7dGhpcy5lZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmdkfHx0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZ2R8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLlJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxVbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSXUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmCnRoaXMuYy5TZCYmdGhpcy5Vbih0aGlzLmMuU2QpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5SZHx8KGUudihrLklzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucWMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLldiPXRoaXMuYWQ9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5JZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOgp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxQdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLldiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5hcCgpO3RoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5sdil0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5JZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT0KTWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnB2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi0KYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLldiPXRoaXMuYWQ9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5aYy5yZXBsYWNlKCJbdGltZV0iLAplLkNnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy52aHx8KHRoaXMudmg9ITAsdGhpcy5tZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHB2OmZ1bmN0aW9uKGEpe2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksCnRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5tZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmNpPWEpfSxQaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sS3U6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxMdTpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSwKWGE6ZnVuY3Rpb24oYSl7ZS5NZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5DZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMueGQmJnRoaXMueGQudHJhY2smJnRoaXMueGQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSnEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYKKHRoaXMua2U9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5IZC5pbXByZXNzaW9ucyYmZS5DcihnLnVybCx0aGlzLkhkLmltcHJlc3Npb25zKT90aGlzLktlKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Tbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnhwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09CnR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuV24oYyksZnx8KGY9dGhpcy5zZyksZXx8KGU9dGhpcy5zZyksdGhpcy5ZbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx4cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09CmJ9KX0sTXY6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLk52LmJpbmQodGhpcykpfSxOdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVmImJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sCkx2OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTsKdmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmNkJiYoYj10aGlzLkwuY2QpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmMuaWQ9dGhpcy5ycDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpOwp2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm52LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubXYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjsKYy5hcHBlbmRDaGlsZChmKTt0aGlzLmMubGYmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsCmIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlFlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5uYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSx5ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sbXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LG52OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuZ2R8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5rZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnRofHwhdGhpcy5MLlVjJiYic3BpZWdlbC5kZSIhPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5nZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm5nKCkpOih0aGlzLnRoPXRoaXMuUWM9dGhpcy5EZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmtlPSEwLGE9ZS5kZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5MZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbmc6ZnVuY3Rpb24oYSl7dGhpcy5OdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoITApfS5iaW5kKHRoaXMpLHRoaXMuanQpOih0aGlzLklkPSEwLHRoaXMuYi5CZSgpLHRoaXMuYi5idSgpLHRoaXMuYmM9ITEsCmUudihrLnFwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy54ZSgpLkdoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5WYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnNjJiYwPHRoaXMuc2MubGVuZ3RoJiYoYS5hZElkcz10aGlzLnNjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5SbysiLSIrdGhpcy5tZjt0aGlzLmMmJnRoaXMuYy5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ra3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLm50PXRoaXMuYVsyXTt0aGlzLnV3PXRoaXMuYVs0XTt0aGlzLmNuPXRoaXMuYVs5XTt0aGlzLnVwPXRoaXMuYVs3XTt0aGlzLmtqPXRoaXMuYVsyXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLlVrPXRoaXMuYVs0XTt0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfQpjLnN2PWI7Yi5wcm90b3R5cGU9eyRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hczp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm50OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51dzp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY246dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnVwOnRoaXMuamooYSl9LGpqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Vazp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5zdnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuJHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnJjPXRoaXMudGM9ITE7dGhpcy52YT0iIjt0aGlzLkJmPSExO3RoaXMuVGc9IiI7ZCYmZC5lbXB0eT90aGlzLmxzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2Mua249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUua2QoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnBnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkpkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5rcy5iaW5kKHRoaXMpLAp0aGlzLmdzLmJpbmQodGhpcykpfSxFZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5IcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxIcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGtzOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpOwp0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlRnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sbHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPXRoaXMuRWcoKTt0aGlzLnRjPXRoaXMucmYoKTt0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LGdzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSWYse2RlcHRoOmF9KSl9LEpjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuSnIoKT90aGlzLmZ2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTmcoKSxoLHtBZFN5c3RlbTp0aGlzLnJxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5MZikpOihhPTAsdGhpcy5EdigpJiZ0aGlzLldlKHRoaXMuc3AoKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMudGM/KHRoaXMudGM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQuUmUoKX0scWg6ZnVuY3Rpb24oKXt0aGlzLnJjPyh0aGlzLnJjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LnFoKCl9LER2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3YoKT90aGlzLmJ2KCk/ITA6KC0xIT10aGlzLkRjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVGQpKTp0aGlzLnNhKHRoaXMuU2Eody5FZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuU2MsRy5LZikpLCExKX0sV2U6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuU2R8fChhLlNkPVtdKTthLlNkLnB1c2godGhpcy5UZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk5lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnRjO2EucWM9YS5xYz9hLnFjOnRoaXMucmM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMucGFyZW50LldlKGEpfSxzcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkRjKCk7YS5PPXRoaXMuS2coKTthLlZiPXRoaXMudHEoKTthLkt2PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMucXEoKTthLmxmPXRoaXMuSHEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMudXEoKSk6Yi5QYS5jb25jYXQodGhpcy5DcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LlhiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuWGImJnRoaXMucGFyZW50LlhiKGIpLGE9MCx0aGlzLkpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sWGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuWGIoYSl9LHVnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGZ2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sY3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxidjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuRGMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVWg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnJmKCkmJihhPSEwKTtyZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEpyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuYWgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSx1cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sS2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksWXc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucGQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxEYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5IdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5rbnx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5acT10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLkh0PWI7Yi5wcm90b3R5cGU9e1lxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWnE6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuSHR8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLllxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuVmI9IiI7dGhpcy5CPXRoaXMucWM9dGhpcy50Yj0hMTt0aGlzLkNlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5EZT0iIn1jLmRtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LEFxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLApiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLkFxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5EZT1hfSxMcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuZG18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVs0XTt0aGlzLnFsPXRoaXMuYVs5XTt0aGlzLkVpPXRoaXMuYVsxMF07dGhpcy5icj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlNrPQpiO2IucHJvdG90eXBlPXtwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Ta3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMucHQoNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsCk9hOiJEVVJBVElPTl9FUlJPUiJ9LFNjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LExmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx6dzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LEF3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmRyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuaXI9YjtiLnByb3RvdHlwZT17Y3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5pcnx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuY3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5lcnJvcj1hO3RoaXMuamQ9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Taj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuU2p8fFVhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJqPXRoaXMuYVszXTt0aGlzLlNyPXRoaXMuYVs1XTt0aGlzLldrPXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNF07dGhpcy52cj10aGlzLmFbNV07dGhpcy5jcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5abD1iO2IucHJvdG90eXBlPXtBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5ScihhKX0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNyOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xazp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy51cihhKX0sCnVyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52cjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLlpsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Baig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5Pdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLm9sPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLnN4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlJ0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxvdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy52cShhKSl9fSx2cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntCeDohMCxBeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntveDoidmlkZW8iLER4OiJqc0N1c3RvbSIsRXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRng6MSxadzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEtxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5vdDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLktxKGIpLHZlbmRvcjpifSk7CnRoaXMuSnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk92Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxWbzpiLHl4OiExfSl9LEp1OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Gcnx8KGEucngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5vbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzVdO3RoaXMuam09dGhpcy5hWzJdO3RoaXMuWG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzEwXX1jLnBqPWI7Yi5wcm90b3R5cGU9e0VrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gazp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5wanx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuRWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXtwcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnBxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5WcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUXU6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZmQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFZxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxpcTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnFqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLlVvPXRoaXMuYVs2XTt0aGlzLkNpPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuY3U9YjtiLnByb3RvdHlwZT17ZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5lbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW86dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuJGwoYSl9LCRsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuY3V8fGJiLExjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmRuKDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSwKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSwKRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuSmx8fGNiOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPQohMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLmdxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5iYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmRkKCk7dGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sCmtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxMZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxnZzpmdW5jdGlvbigpe2lmKHRoaXMuZGQoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTsKdGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuV3d9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSwkdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5teCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuRGMoKTotMX0sRHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sZ3E6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksCjEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5EcShiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLklsfHxkYjsoZnVuY3Rpb24oYyl7Yy5LbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEdyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmhtLkpuLkhuP3dpbmRvdy5PTy5obS5Kbi5Ibi5VdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPQpkYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLktsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzhdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLlR1PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLmd1PWI7Yi5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QbDp0aGlzLmtxKGEpfSwKa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxxOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5UdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuZ3V8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLk9sKDQpOyhmdW5jdGlvbihjKXtjLllpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2coKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSwKemg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLllpfHxoYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5oZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLlhpfHxpYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5EZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksCnRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuaHF8fCh0aGlzLmhxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuQ2god2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLlppfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdD0KdGhpcy5hWzEwXTt0aGlzLlpwPXRoaXMuYVsxMF07dGhpcy5aaj10aGlzLmFbNF07dGhpcy5Tcz10aGlzLmFbMl07dGhpcy5ndD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLkRqPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnA6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpqOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tczp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkRqfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TmMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSwKTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLkxtfHxVOyhmdW5jdGlvbihjKXtjLkttPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTnMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlBxKCl9LE5zOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLkttfHxWOyhmdW5jdGlvbihjKXtjLk1tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPQpbXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy53ZCYmKGI9ZS55cChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksCnRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFljOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LGd2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5hdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSwKUHE6ZnVuY3Rpb24oKXtpZih0aGlzLkljKWZvcih2YXIgYj0wO2I8dGhpcy5JYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkljW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5ndihiKX19KX0pKGMpO3ZhciBsYj1jLk1tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Ncz10aGlzLmFbNV07dGhpcy5Vaj10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbMl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy54cj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5IbD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5xcj1iO2IucHJvdG90eXBlPXtMczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXM6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVqOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sazp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpvOnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHI6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnFuOnRoaXMua28oYSl9LGtvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sbzp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnFyfHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5Mcyg0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHwKb2I7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5XaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVsPXRoaXMuYVs5XTt0aGlzLkFvPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsyXTt0aGlzLld1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLk5pPXRoaXMuYVszXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuTm09YjtiLnByb3RvdHlwZT17dGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnVsOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbzp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc3Q6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLld1OnRoaXMua3QoYSl9LAprdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubHQ6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5OaTp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSms6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuTm18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnRsKDQpOyhmdW5jdGlvbihjKXtjLndsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVyhiKTt0aGlzLlooYSk7dGhpcy5RdCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLm11dGUmJnRoaXMuamEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxZZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLndsfHxzYjsoZnVuY3Rpb24oYyl7Yy52bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmCiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm9hKCkpO2EuS2EoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIHRiPWMudmx8fHRiOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMueGx8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy53aj10aGlzLmFbMV07dGhpcy5qaz10aGlzLmFbMl07dGhpcy5zbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLlNtPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2o6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmprOnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU218fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmdqKDQpOwooZnVuY3Rpb24oYyl7Yy53bj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LApOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLndufHx3YjsoZnVuY3Rpb24oYyl7Yy52bj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sT3Q6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj0KW10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudWM9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5PdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpOwpyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnZufHx4YjsoZnVuY3Rpb24oYyl7Yy54bj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7CnRoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLnhufHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG09dGhpcy5hWzZdO3RoaXMuS3M9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy54aj1iO2IucHJvdG90eXBlPXtDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lczp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy54anx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkNtKDQpOyhmdW5jdGlvbihjKXtjLndtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy52dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LE11OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMud218fEJiOyhmdW5jdGlvbihjKXtjLnZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ycz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5ycz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMudm18fENiOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMueG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbMl07dGhpcy51bT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmlqPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbzp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmlqfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuRG8oNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5wbXx8R2I7KGZ1bmN0aW9uKGMpe2Mub209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLm9kKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5acigpOnRoaXMuamcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuU2YoKXx8dGhpcy5tKCEwKX0sWnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5UdyYmYi5WdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMub2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0sb2Q6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LApueDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5vZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLm9tfHxIYjsoZnVuY3Rpb24oYyl7Yy5xbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMucW18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMTBdO3RoaXMueHQ9dGhpcy5hWzNdO3RoaXMuc2o9dGhpcy5hWzldO3RoaXMud3A9dGhpcy5hWzldO3RoaXMuQmw9dGhpcy5hWzddO3RoaXMuRm09dGhpcy5hWzZdO3RoaXMuUHA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy53bz1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnh0OnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLndwOnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbDp0aGlzLkVtKGEpfSxFbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRm06dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy53b3x8S2IsVGM9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuV3AoNCk7KGZ1bmN0aW9uKGMpe2MubGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sbHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sS2E6ZnVuY3Rpb24oKXt2YXIgYjtIPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPWMubGx8fFg7KGZ1bmN0aW9uKGMpe2Mua2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5ZZSYmYiE9dGhpcy5ZZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLmZhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS50eCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMua2x8fFk7KGZ1bmN0aW9uKGMpe2MubWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0g9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihIKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMubWx8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpsPXRoaXMuYVs1XTt0aGlzLm9yPXRoaXMuYVsxXTt0aGlzLkxqPXRoaXMuYVsxMF07dGhpcy5lbz10aGlzLmFbOV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5qdj10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbM107dGhpcy5Hbj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs0XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3lsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3I6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Majp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZW86dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFpOnRoaXMuaXYoYSl9LGl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuanY6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnJyfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy5naz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApodTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0scXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5na3x8T2I7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5ma3x8UGI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTsKaWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5oa3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLmF0PWI7Yi5wcm90b3R5cGU9e1ZzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Xczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMuYXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5Wcyg0KTsoZnVuY3Rpb24oYyl7Yy5Cbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxOZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sClB0OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlJjJiYodGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJjPSExKSx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksCiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuQm58fFRiOyhmdW5jdGlvbihjKXtjLkFuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksCmImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE9mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pOwp0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLlN0KCl9LFN0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYil7dGhpcy5VYihiKX0pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuTnQ9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5Bbnx8VWI7CihmdW5jdGlvbihjKXtjLkNuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuUHQoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLkNufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJrPXRoaXMuYVsxMF07dGhpcy55aT10aGlzLmFbNF07dGhpcy5SbT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLiRqPWI7Yi5wcm90b3R5cGU9e0FrOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuQms6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuJGp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkFrKDQpOyhmdW5jdGlvbihjKXtjLiRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuRHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGh1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Ec30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYodGhpcy54aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuJG18fE87KGZ1bmN0aW9uKGMpe2MuWm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy50dSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuWm18fFA7KGZ1bmN0aW9uKGMpe2MuYW49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYW58fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5PcT10aGlzLmFbMl07dGhpcy5SaT10aGlzLmFbM107dGhpcy5mbD10aGlzLmFbMV07dGhpcy5rcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLm5sPWI7Yi5wcm90b3R5cGU9e05xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmk6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ubHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuTnEoNCk7KGZ1bmN0aW9uKGMpe2MuWWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Za3x8WjsoZnVuY3Rpb24oYyl7Yy5Yaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLlhrfHxhYTsoZnVuY3Rpb24oYyl7Yy5aaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLlprfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGo9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtjajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLk9zfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5jaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5ia3x8ZGM7KGZ1bmN0aW9uKGMpe2MuYWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5ha3x8ZWM7KGZ1bmN0aW9uKGMpe2MuY2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLmNrfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmw9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuWHE9CnRoaXMuYVsxXTt0aGlzLllzPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs0XTt0aGlzLnRzPXRoaXMuYVsxXTt0aGlzLkVuPXRoaXMuYVsxMF07dGhpcy5HdD10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbNV07dGhpcy56cz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLnR2PWI7Yi5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemo6dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhxOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zczp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSGs6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRzOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Fbjp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLkd0OnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5KbTp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnR2fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hbCg0KTsoZnVuY3Rpb24oYyl7Yy5yaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubWUoKTt0aGlzLmZnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LApFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwOwppZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfSxtZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJgpiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD8KdGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzddO3RoaXMuQ3Y9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMuRmo9dGhpcy5hWzEwXTt0aGlzLnd3PXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVs5XTt0aGlzLnVuPXRoaXMuYVs0XTt0aGlzLkhtPXRoaXMuYVszXTt0aGlzLlBpPXRoaXMuYVs0XTt0aGlzLmxtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQXM9YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJqOnRoaXMuQnYoYSl9LEJ2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnl1Ogp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy52dyhhKX0sdnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnd3OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW46dGhpcy5HbShhKX0sR206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IbTp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5Bc3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuYWooNCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuZm09YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5FcShhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLAp0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMuemQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0sT3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMuemQubGVuZ3RoO2ErKyl0aGlzLnpkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5mbXx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs5XTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLlVsPXRoaXMuYVs2XTt0aGlzLllyPXRoaXMuYVs3XTt0aGlzLlVxPXRoaXMuYVs2XTt0aGlzLkx0PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs0XTt0aGlzLkdpPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLmpxPWI7Yi5wcm90b3R5cGU9e3lrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56azp0aGlzLnVvKGEpfSx1bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudm86dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVsOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zcjp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5MdDp0aGlzLldsKGEpfSxXbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhsOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuanF8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLnlrKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoKIiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLkV2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLkhzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7dmFyIEk9bmV3IEosbD0hMTtJLmthKCk7CkkuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnRyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbMTBdO3RoaXMuc209dGhpcy5hWzEwXTt0aGlzLlVzPXRoaXMuYVsxXTt0aGlzLmduPXRoaXMuYVsxMF07dGhpcy5CbT10aGlzLmFbOF07dGhpcy5zdz10aGlzLmFbN107dGhpcy5ldT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlFvPWI7Yi5wcm90b3R5cGU9e3RrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51azp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNtOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vczp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMucncoYSl9LHJ3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdzp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlFvfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9Cm51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnZpPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihhKXt0aGlzLm5iPWF9LGp1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLnlyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsdGhpcy5uYi53YSx0aGlzLm5iLmFmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMubmIuQmMpO2Vsc2UgaWYodGhpcy5ScSgpKXRoaXMuZnUoZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuUXUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7ClI9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuaXUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnFzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihjPXRoaXMucGxheWVyLkplKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsYyxmKTt0aGlzLnBsYXllci5MaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy51ZC5nZXRUaW1lKCksdGhpcy51ZD1hLDNFNTxiPyEwOiExO3RoaXMudWQ9YTtyZXR1cm4hMX0sRXU6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7CmUuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfSxEdTpmdW5jdGlvbihhKXtpZighdGhpcy55aCl7ZS5nZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMucHUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLAohMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LFZ0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIudnUodGhpcy5EdS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxGZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS5nZigibWlkcm9sbCIpO2lmKCF0aGlzLm5oKXt0aGlzLm5oPSEwO3ZhciBiPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksCnRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LFV0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIub3UodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5FdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLlV0KCk7dGhpcy5WdCgpfSxXdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5pdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQmQ9dGhpcy5BZC5sZW5ndGh9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9CiExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxmdTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRHQuYmluZCh0aGlzKSl9LER0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxxczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9dGhpcy5aZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy52aXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcz10aGlzLmFbMV07dGhpcy5VbT10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbNl07dGhpcy4kcz10aGlzLmFbM107dGhpcy5zbj10aGlzLmFbOF07CnRoaXMuZWs9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbM119Yy56bj1iO2IucHJvdG90eXBlPXtCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51aTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuJHM6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuem58fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkJzKDQpfSkuY2FsbChLdXRhZWNoZWRpZVBvWWFpLApLdXRhZWNoZWRpZVBvWWFpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.244.75
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.75.244.243.136.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- 5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
|
GET
H2
|
200
|
B23012841.252865594;dc_ver=54.150;dc_eid=40004000;sz=300x250;u_sd=1;dc_adk=1001883470;ord=1ti265;click=https%3A%2F%2Fadclick.g.doubleclick.net%2Fpcs%2Fclick%3Fxai%3DAKAOjsvxDSQ92IH_1mmQp_CUtuW2BQHk...
Show response
ad.doubleclick.net/ddm/adj/N497403.422087STROEERCONTENTGROU/
Frame 67BD
|
22 KB
10 KB
|
46ms
45ms
|
Script
text/javascript |
172.217.18.102
Google LLC
|
|
General
- Full URL
- https://ad.doubleclick.net/ddm/adj/N497403.422087STROEERCONTENTGROU/B23012841.252865594;dc_ver=54.150;dc_eid=40004000;sz=300x250;u_sd=1;dc_adk=1001883470;ord=1ti265;click=https%3A%2F%2Fadclick.g.doubleclick.net%2Fpcs%2Fclick%3Fxai%3DAKAOjsvxDSQ92IH_1mmQp_CUtuW2BQHkJc4cXTyjsBng0l-dsvC11aWSzOyv_M7ohZrxFfUoPiYColo7tuRT9Pu4mrao4itx3aT9rue5h7eokvsGF_HpE7jlLlT8WLrH6uTrzzb8_vuV9TGfuktXk79DV97WpDmYPUZy3FrFNBe0IWmUcykktjawvV8f_iL5ZiAovFL8g-Xok6XyYn8L4xhMeBa1EM-mAIt3fMmv-Ujj132dMwncYBpAfjnafuDpvtX2pqgUnIO6_0LDsiSKIA%26sig%3DCg0ArKJSzOK272zniNFnEAE%26urlfix%3D1%26adurl%3D;dc_rfl=1,https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F$0;xdt=0;crlt=ktbhG1Q1*Z;osda=2;sttr=25;prcl=s?
- Requested by
- Host: www.googletagservices.com
URL: https://www.googletagservices.com/dcm/impl_v54.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.18.102
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s42-in-f6.1e100.net
- Software
-
cafe /
- Resource Hash
- 30eccf45a4124724cc135c163e40c42237a44de60df95ba854ec8428c6b756b8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
iframe
sync.teads.tv/
Frame 0675
|
0
0
|
43ms
32ms
|
Document
text/html |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://sync.teads.tv/iframe?pid=73584&userId=2deb466b-cb5b-4a18-b149-748b53f3323a&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1571559411908
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
akka-http/10.1.5 /
- Resource Hash
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
30ms
29ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
31ms
31ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
express_html_inpage_rendering_lib_200_260.js
Show response
s0.2mdn.net/879366/
Frame 67BD
|
119 KB
41 KB
|
25ms
6ms
|
Script
text/javascript |
2a00:1450:4001:818::2006
Google LLC
|
|
General
- Full URL
- https://s0.2mdn.net/879366/express_html_inpage_rendering_lib_200_260.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2006
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 76d0d32ecf3e068833862d36267bb22f983440a9e102e8411819f0f97360da56
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
UFYwWwmt.js
Show response
tpc.googlesyndication.com/sodar/
Frame 67BD
|
41 KB
15 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81f::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/UFYwWwmt.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81f::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 5056305b09ad6474ea540f796c79be51d6b8e96043cb3d7bc4ef774e56765f4f
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
DATA
|
200
OK
|
truncated
/
Frame 67BD
|
220 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
Enqz_20U.html
tpc.googlesyndication.com/sodar/
Frame C00C
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:81f::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/Enqz_20U.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/UFYwWwmt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81f::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
lidar.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 67BD
|
79 KB
29 KB
|
13ms
13ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/lidar.js?cache=r20110914
- Requested by
- Host: s0.2mdn.net
URL: https://s0.2mdn.net/879366/express_html_inpage_rendering_lib_200_260.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 79a29358483e517b6f74d6b58a47c6139f29cc0d0a7913bfe92bd285a6db3911
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
cc.html
s0.2mdn.net/9452533/1569406398250/
Frame 1A69
|
0
0
|
7ms
6ms
|
Document
text/html |
2a00:1450:4001:818::2006
Google LLC
|
|
General
- Full URL
- https://s0.2mdn.net/9452533/1569406398250/cc.html
- Requested by
- Host: s0.2mdn.net
URL: https://s0.2mdn.net/879366/express_html_inpage_rendering_lib_200_260.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::2006
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
googleads4.g.doubleclick.net/pcs/
Frame 67BD
|
0
117 B
|
29ms
27ms
|
Image
image/gif |
216.58.207.66
Google LLC
|
|
General
- Full URL
- https://googleads4.g.doubleclick.net/pcs/view?xai=AKAOjsvM_BJRqQrROGhp2vyQYYsKiq_Nhi8HvSl5weGs1KcAXxMmLkXlJLQlHzmKYw34MzaGc3b1IK0sHzm9FU74NLDS9w9yDxdtdJWLtWPkmmcuDucLynCe-CxRu5hsWEozLl5N5ZPRk20&sig=Cg0ArKJSzLGttsGCBrddEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
216.58.207.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s25-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
308 B
|
177ms
135ms
|
Image
image/gif |
104.244.37.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=e71f43df-b5db-e2c1-5115-cd2e2be34d22&tv={c:rzDFmp,pingTime:-10,time:414,type:s,mvn:ZnNjPTEyLHNkPTMsbm89Nyxhc3A9MQ--,fsc:17.4.95v220002022020220000022002222000022220202020222220222220002222022002222200002220222022222222222000220200000022220222220222222222222202222222222222222222222222222222222222200000022022020020000002002202022022022222222000000000020222202022022222000000020000000000000000000002220002220000022200222202220022200200222022202220022222220020222222000220000222202222202222000002002002222222222220022202200022002220222202,sd:MTcuNC45NXYxMjAwfHwxNjAwfHwxfHwxfHwyNHx8MTIwMHx8MHx8MHx8MXx8bGFuZHNjYXBlLXByaW1hcnl8fDI0fHw0LzN8fDQvM3x8MHx8MTYwMA--,no:MTcuNC45NXZNb3ppbGxhfHxOZXRzY2FwZXx8bnx8MTZ8fG58fDB8fG58fExpbnV4IHg4Nl82NHx8R2Vja298fDIwMDMwMTA3fHwtMTIwfHxNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNF81KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzQuMC4zNzI5LjE2OSBTYWZhcmkvNTM3LjM2fHwxfHwxfHxHb29nbGUgSW5jLnx8bg--,asp:1571559412008||36d44b9538408f275b70abda27603357||675c74d5f114ba25a49fb0f4cb02f70f||528e989498b46c402a2b189ce9501254||79a4c92de2397cb57eee7886e8b6189b||d82f6a31bde49abdfbbf90ef21f4a7d9||63e0d511ac3d19dad7a53047e7bfeeec||77b97241ddc60c8ae5813d74ecc5d4d7||1529428597}
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.37.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- daldt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
data
lb33.s400.meetrics.net/
|
43 B
308 B
|
2ms
1ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb33.s400.meetrics.net/data?/bHXvE8UAA/k0FOImvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Ax1A15A0xAxzA54AmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA40A1wAz3A1mAjwFpkF9kElzFr0FvwFmhEwhF91Ax5A4yA5zA42A1mAjpFk9BxzA4yA5wA4zAy4A4yAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1xA54Ay5Az4A21AmhEwkF91Ax5A4yA5zA42A1mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Ax1A15A0xAx2A4wALlnFCUkzF2BPSEAAAAAAABAwhAPBAAFAAAwhTl5/APAAAJGA5BABl5/AZAAAOA55A55A85B55A58E55A55AGAxzA4yA0wArl5/APaAAJGA5BAHl5/APAAAgMA6DAMl5/ASksFJFjAAAAAAAAAAAAEAAAAwhAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHA33Aw4Ey1AwBEMAxzA4yA5wA4zAy4A4yAGAkpFylFj0FAAAAIAy4A01AwzA31AKA1xA54Ay5Az4A21AGAihFuuFlyFKA1xA54Ay5Az4A21AKA1xA54Ay5Az4A21AwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdJGA5BACMA6DAFAAAl5/AAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjF2acFWA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb33.s400.meetrics.net/
|
43 B
308 B
|
2ms
1ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb33.s400.meetrics.net/data?/bHXvF+UAA/k0FeMmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Ax1A15A0xAxzA54AmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA40A1wAz3A1mAjwFpkF9kElzFr0FvwFmhEwhF91Ax5A4yA5zA42A1mAjpFk9BxzA4yA5wA4zAy4A4yAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1xA54Ay5Az4A21AmhEwkF91Ax5A4yA5zA42A1mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Ax1A15A0xAx2A4wAmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9xAyzA3yA41Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF91Ax4Aw4A5zAz3AwmAjpFk9BxzA4yA44A4wA1xA41AmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF91Ax4Aw4A5zAz3AwmAhwFk9B1xA4wA45AzzA3wAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Ax1A15A0xAywA3yALlnFDTkzFtPuFAAAAAAABhfpAPBAAFAAhfpTbosAPAAAJPA2GABbosASksFhFjAAAAAAAAAAAAEAAAhfpAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA44A4wA1xA41AGAkpFylFj0FAAAAKAxyAz3Ay4A1zA31AKA1xA4wA45AzzA3wAJAylFj0FhuFnsFlBFKA1xA4wA45AzzA3wAKA1xA4wA45AzzA3wAzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPA2GAsEA6DAFAAAbosAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFJps1YA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame FB60
|
0
57 B
|
29ms
28ms
|
Fetch
image/gif |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuHue5cZ2K5ofXbARlMkY1vHOAvCVOGZOzjC-q7NuE7sT48ulXMW62anvED9VMcnhon3wBPn4oiK7-SwdLe_pENOsm3XuHLW9ObnDNIKkS9EqTB8aEawtX_4KPiXil2TV-5cRp3I73fk0yDsKQqLL_VxEEXRE_rHdN1kBQmulAJXCO-Z2YnN5Li3OOz1s5hTJEswmbi92Nn6qF-QwwDHrGOfCMAhIvJwmPk3ufrtQwQRmiI_a1b6AnTiivLHy9IVFQEBz6xDbMvdfY50qybZknUHa-HjXSHf_6fWa-l&sig=Cg0ArKJSzBBGfKmYNUheEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
skeleton.js
Show response
pixel.adsafeprotected.com/rjss/st/331316/39077540/
Frame FB60
|
197 KB
67 KB
|
75ms
41ms
|
Script
application/javascript |
199.166.0.26
Integral Ad Science
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame FB60
|
77 KB
29 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019101401.js?21064803
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:825::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- f820f689e79fe927155372514936423b30eb400c1d2b87b6503d1398f6d352c7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
TLOU2_300x600.jpg
media.gamona.de/assets/last_of_us_2/
Frame FB60
|
65 KB
65 KB
|
38ms
11ms
|
Image
image/jpeg |
82.149.242.40
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
v2
odr.mookie1.com/t/
Frame FB60
Redirect Chain
-
https://bs.serving-sys.com/serving/adServer.bs?cn=display&c=19&mc=imp&pli=28960280&PluID=0&ord=918139817&rtu=-1
-
https://odr.mookie1.com/t/v2?tagid=V2_247915&src.visitorid=8baaceaa-c320-499a-860b-5409634bac4c-08
|
43 B
298 B
|
14ms
14ms
|
Image
image/gif |
34.98.67.61
Google LLC
|
|
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
|
0
58 B
|
107ms
106ms
|
Image
image/gif |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&r=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&w=300&h=600
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
skeleton.js
Show response
static.adsafeprotected.com/
Frame FB60
Redirect Chain
-
https://pixel.adsafeprotected.com/rfw/st/331316/39077540/skeleton.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&adsaf...
-
https://static.adsafeprotected.com/skeleton.js
|
17 B
299 B
|
16ms
15ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H/1.1
|
200
OK
|
sca.17.4.95.js
Show response
static.adsafeprotected.com/
Frame D820
|
81 KB
20 KB
|
29ms
28ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame FB60
|
218 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
308 B
|
135ms
135ms
|
Image
image/gif |
104.244.37.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=331316&asId=9c19bb53-d197-2bdf-f646-12fc7e91b354&tv={c:rzDFpH,pingTime:-2,time:41,type:a,im:{sf:0,pom:1,prf:{mdA:3,mdZ:90,beA:93,beZ:94,mfA:95,cmA:96,inA:96,inZ:100,prA:100,prZ:106,si:111,poA:112,poZ:116,cmZ:116,mfZ:116,loA:128,loZ:129,ltA:133,ltZ:133}},sca:{dfp:{df:4,sz:300.600,dom:img}},env:{gca:0},clog:[{piv:94,vs:i,r:,w:300,h:600,t:18}],es:0,sc:1,ha:1,gm:1,slTimes:{i:41,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1318.121.300.600,am:i,cc:1318.121.300.600,piv:94,obst:0,th:0,reas:,bkn:{piv:[36~75],as:[36~300.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rFqv8h5+11|12|1311|1312|1313|1314|14|151|1611|17|18|19|1a|1b|1c|1d|1e|1f|1g|1h|1i.346702-39754026|1i1|1j|1k|1l1|1l2|1m|1n*.331316-39077540,idMap:1n*,rend:1,renddet:IMG.qs,rmeas:1,slid:[google_ads_iframe_4444/giga.de_sd/software_artikel_4,google_ads_iframe_4444/giga.de_sd/software_artikel_4__container__,sdgAdServerContainer-sky,sky-2],sinceFw:21,readyFired:true}&br=u
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.37.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- daldt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
data
lb33.s400.meetrics.net/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb33.s400.meetrics.net/data?/bHXvGcXAA/k0FbQmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Ax1A15A0xAxzA54AmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA40A1wAz3A1mAjwFpkF9kElzFr0FvwFmhEwhF91Ax5A4yA5zA42A1mAjpFk9BxzA4yA5wA4zAy4A4yAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1xA54Ay5Az4A21AmhEwkF91Ax5A4yA5zA42A1mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Ax1A15A0xAx2A4wAmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9xAyzA3yA41Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF91Ax4Aw4A5zAz3AwmAjpFk9BxzA4yA44A4wA1xA41AmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF91Ax4Aw4A5zAz3AwmAhwFk9B1xA4wA45AzzA3wAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Ax1A15A0xAywA3yAmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29By4A1zA41A31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA4yA4yAzyA05AmjEpkF9xAz4Ay4A42AwyA4yAymAzpF6lF9zAwwA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B1xA4yA4yAzyA05AmhEwkF91Ax4Ay4AyzAy0A5mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3xA11A50AxyAyzAxBELlnFETkzFrZAAAOA55A55A85B55A58E55A55AGAx2A55A1zArbosARksFAQtjFjUqIZA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
/
Show response
track.adform.net/Serving/Cookie/
|
92 B
468 B
|
21ms
21ms
|
Script
text/javascript |
37.157.4.39
ADFORM
|
|
|
GET
H2
|
200
|
f9b17833-d68c-4e4d-b319-d6061d45aa9f
Show response
boot.pubstack.io/v1/tag/
|
1 KB
826 B
|
114ms
32ms
|
Script
application/javascript |
52.208.125.71
Amazon.com
|
|
|
GET
H2
|
200
|
content14_10_18m.js
Show response
vidstat.taboola.com/
|
37 KB
8 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
oppsula.js
Show response
vidstat.taboola.com/oppsula/1.3.6/
|
15 KB
5 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
OvaMediaPlayer.js
Show response
vidstat.taboola.com/vpaid/vPlayer/player/v10.5.0/
|
678 KB
180 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame 78DC
|
0
0
|
16ms
15ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V75qoCFgOO_YdP4KmPWQSO_YdP4KmPWQUAAAAGBvQHHLiZMCYLFm1CXCxHu8FqNNjtdpPZZjcbrqYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ9Q-_WTE__YiRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDQht7jyJqlOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugIWjEYrM4gJpvRbjI7AAAAgLv___9_PRBZziYj58bmXI4szo1r45mtJpbVyuUZWTY2i8vkPU-8-1khsm-fvhFhmf2-g4JyenrMLoOM5TIZ1AJZ0-TyG8QHDcNyMgjmN2GL0Woy2SyHs-ViMhiOhqPR_gRuNMAJGg4Hi91gsVsshpPFZDRYDhYoEIMJTshwtJmsRrvVbrIcTkaj2WayQYpWrWajzWC4mk1mu91qOBguRyOkaM1iNpksZqPlbjNYTkaD4WQ4RJhcDBe24XC01q1MvrVoMFm5lbvVYq1yrSYWi2s2nHiMa9HrYzotXMuRb7NFwQClvQgu0onmdPm7XJa35m1x65w-h0Us0Zws0onssq8sZ5ORc2NzLkcW58a18cxWE8tq5fKMLBubxWXyNxfDhW04HK11K5NvLRpMVm7lbrVYq1yricXimg0nHuNa9PqYTgvXcuTb7Bur3WK1Wo4Wi31jtVusVsvRYrHv0Bm-q8_ZqLxpFR6TV3Fujiwzp0HhMli8P4lpMe3ODp7f7-hUqS4aY0P2TSjMBo_BoIglgtNFOhG9jKeLWCJ5WqQTjWUwWc5cw8Vst5p5djPfyDNyeJwbw2Lk8C08holYojRdpBO97mVxGA6fv-DhPDzMftHTcPj8BQ_n4WF2i_0-p92t-bt1LqPp81bdTW7N3y32uzynt9JoeYv9PqfdLbj8LWaX22VR_7EhRqO5bjZXDJZzzWCVAAAAAAAAAACWMGfeBAAAAOA0kMViMFksFwBCjHWX4FMq5NEJ_K248WOIOV3-LpflrXlb3Dqnz2FlAImdAg!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
52 B
|
18ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7aysCFgOO_YdP4KmPWQSO_YdP4KmPWQUAAAAGBvQHHLiZMCYLFm1CXCxHu8FqNBguhsvBcLbZbIbAgZsJY7Jg0SbExXK0G6xGg91uN5ltdrPhagohxnKZDGqBhGX2-w4KyunpMbsMMpbLZFALZE2Ty--GLzSdDp_rXq_7_e46p89hF7n8upfFYTh8_oKH8_Aw-0VPw-HzFzych4fZLfb7nHa35u_WuYymz1t1N7k1f7fY7_Kc3kqj5S32-5x2t-Dyt5hdbpdfDgAAAAAPAEqF_RA_gAAAEQAAAAASAAAAABQBFf8WAhcAAAAAGAAFWD8aAFAcDOe6W192o8P1edn9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNNgD8OAD8EBUkFjECAAAAACSqc3jaFInVBZVAAAE6VYAVwAAAW3oPY6sYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTYhozC0tiKWAV-0XEABg7RcQAIBN3QAA3gLggo6gFYPB6gxishntJrMDAAAAuPv____XA5HlbDJybmzO5cji3Lg2ntlqYlmtXJ6RZWOzuEze88S7nxUi-_bpGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-BGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMnFcGEbDkdr3crkW4sGk5VbuVst1irXamKxuGbDice4Fr0-ptPCtRz5NlsUDFDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pyNhk5NzbncmRxblwbz2w1saxWLs_IsrFZXCZ_czFc2IbD0Vq3MvnWosFk5VbuVou1yrWaWCyu2XDiMa5Fr4_ptHAtR77NvrHaLVar5Wix2DdWu8VqtRwtFvsOneG7-pyNyptW4TF5FefmyDJzGhQug8X7k5gW0-7s4Pn9jk6V6qIxNmTfhMJs8BgMilgiOF2kE9HLeLqIJZKnRTrRWAaT5cw1XMx2q5lnN_ONPCOHx7kxLEYO38JjmIglStNFOtHrXhaH4fD5Cx7Ow8PsFz0Nh89f8HAeHma32O9z2t2av1vnMpo-b9Xd5Nb83WK_y3N6K42Wt9jvc9rdgsvfYna5XRb1HxtiNJrrZnPFYDnXDFYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcJPqVCHp3A34obP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&cmcv=&pix=31589837&cb=1571559412401&uv=231412&tms=1571559412401&abt=aaTestV46_vA!expl_vB!ufm_vE&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1571559410220.5562!ts:1571559412401&
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
52 B
|
18ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7aysCFgOO_YdP4KmPWQSO_YdP4KmPWQUAAAAGBvQHHLiZMCYLFm1CXCxHu8FqNBguhsvBcLbZbIbAgZsJY7Jg0SbExXK0G6xGg91uN5ltdrPhagohxnKZDGqBhGX2-w4KyunpMbsMMpbLZFALZE2Ty--GLzSdDp_rXq_7_e46p89hF7n8upfFYTh8_oKH8_Aw-0VPw-HzFzych4fZLfb7nHa35u_WuYymz1t1N7k1f7fY7_Kc3kqj5S32-5x2t-Dyt5hdbpdfDgAAAAAPAEqF_RA_gAAAEQAAAAASAAAAABQBFf8WAhcAAAAAGAAFWD8aAFAcDOe6W192o8P1edn9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNNgD8OAD8EBUkFjECAAAAACSqc3jaFInVBZVAAAE6VYAVwAAAW3oPY6sYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTYhozC0tiKWAV-0XEABg7RcQAIBN3QAA3gLggo6gFYPB6gxishntJrMDAAAAuPv____XA5HlbDJybmzO5cji3Lg2ntlqYlmtXJ6RZWOzuEze88S7nxUi-_bpGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-BGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMnFcGEbDkdr3crkW4sGk5VbuVst1irXamKxuGbDice4Fr0-ptPCtRz5NlsUDFDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pyNhk5NzbncmRxblwbz2w1saxWLs_IsrFZXCZ_czFc2IbD0Vq3MvnWosFk5VbuVou1yrWaWCyu2XDiMa5Fr4_ptHAtR77NvrHaLVar5Wix2DdWu8VqtRwtFvsOneG7-pyNyptW4TF5FefmyDJzGhQug8X7k5gW0-7s4Pn9jk6V6qIxNmTfhMJs8BgMilgiOF2kE9HLeLqIJZKnRTrRWAaT5cw1XMx2q5lnN_ONPCOHx7kxLEYO38JjmIglStNFOtHrXhaH4fD5Cx7Ow8PsFz0Nh89f8HAeHma32O9z2t2av1vnMpo-b9Xd5Nb83WK_y3N6K42Wt9jvc9rdgsvfYna5XRb1HxtiNJrrZnPFYDnXDFYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcJPqVCHp3A34obP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&cmcv=&pix=&cb=1571559412434&uv=231412&tms=1571559412434&abt=aaTestV46_vA!expl_vB!ufm_vE&ft=0&unm=FEED_MANAGER
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
POST
H2
|
204
|
ngx_pagespeed_beacon
Show response
www.giga.de/
|
0
73 B
|
7ms
7ms
|
XHR
text/plain |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/ngx_pagespeed_beacon?url=http%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
BLOB
|
206
Partial Content
|
79d12e4c-42ba-4566-9a6b-1de9be762920
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
BLOB
|
206
Partial Content
|
63222bfc-eed9-4826-9b71-1269fa739c76
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
8ms
7ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
42ms
9ms
|
Script
application/javascript |
89.163.159.99
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1014 B
|
89ms
21ms
|
Script
application/javascript |
62.168.44.119
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
29ms
28ms
|
Script
text/javascript |
54.246.164.155
Amazon.com
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
495 B
|
45ms
15ms
|
Image
image/gif |
35.186.238.175
Google LLC
|
|
|
GET
H2
|
200
|
player.css
vidstat.taboola.com/vpaid/vPlayer/player/v10.5.0/assets/
|
14 KB
3 KB
|
6ms
6ms
|
Stylesheet
text/css |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
52 B
|
15ms
14ms
|
Image
text/plain |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=81&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7aysCFgOO_YdP4KmPWQSO_YdP4KmPWQUAAAAGBvQHHLiZMCYLFm1CXCxHu8FqNBguhsvBcLbZbIbAgZsJY7Jg0SbExXK0G6xGg91uN5ltdrPhagohxnKZDGqBhGX2-w4KyunpMbsMMpbLZFALZE2Ty--GLzSdDp_rXq_7_e46p89hF7n8upfFYTh8_oKH8_Aw-0VPw-HzFzych4fZLfb7nHa35u_WuYymz1t1N7k1f7fY7_Kc3kqj5S32-5x2t-Dyt5hdbpdfDgAAAAAPAEqF_RA_gAAAEQAAAAASAAAAABQBFf8WAhcAAAAAGAAFWD8aAFAcDOe6W192o8P1edn9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNNgD8OAD8EBUkFjECAAAAACSqc3jaFInVBZVAAAE6VYAVwAAAW3oPY6sYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTYhozC0tiKWAV-0XEABg7RcQAIBN3QAA3gLggo6gFYPB6gxishntJrMDAAAAuPv____XA5HlbDJybmzO5cji3Lg2ntlqYlmtXJ6RZWOzuEze88S7nxUi-_bpGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-BGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhMnFcGEbDkdr3crkW4sGk5VbuVst1irXamKxuGbDice4Fr0-ptPCtRz5NlsUDFDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8pyNhk5NzbncmRxblwbz2w1saxWLs_IsrFZXCZ_czFc2IbD0Vq3MvnWosFk5VbuVou1yrWaWCyu2XDiMa5Fr4_ptHAtR77NvrHaLVar5Wix2DdWu8VqtRwtFvsOneG7-pyNyptW4TF5FefmyDJzGhQug8X7k5gW0-7s4Pn9jk6V6qIxNmTfhMJs8BgMilgiOF2kE9HLeLqIJZKnRTrRWAaT5cw1XMx2q5lnN_ONPCOHx7kxLEYO38JjmIglStNFOtHrXhaH4fD5Cx7Ow8PsFz0Nh89f8HAeHma32O9z2t2av1vnMpo-b9Xd5Nb83WK_y3N6K42Wt9jvc9rdgsvfYna5XRb1HxtiNJrrZnPFYDnXDFYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcJPqVCHp3A34obP4aY0-XvclnemrfFrXP6HFYGkNgpAA!&cmcv=&uv=231412&unm=FEED_MANAGER&cb=1571559412496&abt=aaTestV46_vA!expl_vB!ufm_vE&baseReportD=taboola.com&dataCenter=am&
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
|
match
pixel.consentric.de/tp/
|
43 B
373 B
|
41ms
11ms
|
Image
image/gif |
62.138.221.190
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5198293865
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
43 B
247 B
|
26ms
6ms
|
XHR
application/json |
35.158.187.39
Amazon.com
|
|
|
GET
H2
|
200
|
monitoring.js
Show response
cdn.prod.pubstack.io/
|
61 KB
19 KB
|
20ms
6ms
|
XHR
application/javascript |
34.95.76.218
Google LLC
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
34ms
10ms
|
Script
text/plain |
85.114.144.107
MYLOC-AS
|
|
General
- Full URL
- https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
- Requested by
- Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
85.114.144.107
, Germany,
ASN24961
(MYLOC-AS, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.18/
|
5 KB
2 KB
|
23ms
7ms
|
Script
application/javascript |
2600:9000:21f3:1000:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
31ms
30ms
|
Script
text/javascript |
54.246.164.155
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-2&screen=1200x1600&mbr=88f7c511abc193e2d0c384db1731593e&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=27341569391
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
54.246.164.155
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-54-246-164-155.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- b1576912f198b7c12515f3e3123ca8ade4a03eff56497ffe326b3304a8c636ed
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
308 B
|
135ms
135ms
|
Image
image/gif |
104.244.37.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=e71f43df-b5db-e2c1-5115-cd2e2be34d22&tv={c:rzDFwm,pingTime:1,time:1031,type:p,clog:[{piv:100,vs:i,r:,w:800,h:250,t:19}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1031,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:19,wc:0.0.1600.1200,ac:393.121.800.250,am:i,cc:393.121.800.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1026~100],as:[1026~800.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:202,fm:rFqv8h5+11|12|1311|1312|1313|1314|14|151|1611|17|18|19|1a|1b|1c|1d|1e|1f|1g|1h|1i*.346702-39754026|1n.331316-39077540,idMap:1i*,rend:0,renddet:WINDOW,rmeas:0}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.37.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- daldt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
308 B
|
138ms
138ms
|
Image
image/gif |
104.244.37.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=e71f43df-b5db-e2c1-5115-cd2e2be34d22&tv={c:rzDFwn,pingTime:1,time:1032,type:c,clog:[{piv:100,vs:i,r:,w:800,h:250,t:19}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1032,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:19,wc:0.0.1600.1200,ac:393.121.800.250,am:i,cc:393.121.800.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1027~100],as:[1027~800.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:202,fm:rFqv8h5+11|12|1311|1312|1313|1314|14|151|1611|17|18|19|1a|1b|1c|1d|1e|1f|1g|1h|1i*.346702-39754026|1n.331316-39077540,idMap:1i*,rend:0,renddet:WINDOW,rmeas:0,metricId:forwrd1}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.37.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- daldt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
125ms
30ms
|
Script
application/javascript |
34.250.43.132
Amazon.com
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame 2F94
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBSa0ES_-BDwkWDUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4207198039948786911
|
42 B
659 B
|
39ms
29ms
|
Image
image/gif |
54.246.164.155
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame 6824
|
0
0
|
116ms
29ms
|
Document
text/html |
34.248.95.73
Amazon.com
|
|
|
POST
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
29ms
29ms
|
XHR
text/plain |
52.30.195.15
Amazon.com
|
|
|
POST
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
30ms
30ms
|
XHR
text/plain |
52.30.195.15
Amazon.com
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 21CC
|
42 B
110 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjst_veoKUPvIEabrQPq92wp1pD-CGWJu9ddSCSN-x_ao7O-zNk-UuL76jq-Bj-1gDAKBdWqgoJNC5tIJQZDuR-zacgbUDzlClVgoK82fICQ&sig=Cg0ArKJSzKeKB8BGzyjDEAE&adk=3040188762&tt=423&bs=1585%2C1185&mtos=1099,1099,1099,1099,1099&tos=1099,0,0,0,0&p=121,393,371,1193&mcvt=1099&rs=3&ht=0&tfs=906&tls=2005&mc=1<e=1&bas=0&bac=0&met=no&avms=nio&niot_obs=617&niot_cbk=627&md=2&lm=2&rst=1571559411497&rpt=184&isd=0&msd=0&oseid=3&xdi=0&xosd=1&ps=1618%2C6899&ss=1600%2C1200&pt=1583&bin=1&deb=1-2-7-13-18-14-121-16-0-0-0&tvt=1997&r=v&id=osdim&vs=4&uc=10&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191014
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 67BD
|
42 B
110 B
|
16ms
16ms
|
Image
image/gif |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsvLDwrKYUxG3-7vAAgjcad8IKdQ37-pOI1j8CdvjjmDh8pD0Ky4Vmsg7UmaUfxY4t5wCOEhEGJc9vCETFpdzNU9q-aCM-B2bvaoc7bBdQg&sig=Cg0ArKJSzMUTWle58Hv0EAE&adk=3694558186&tt=628&bs=1585%2C1185&mtos=1032,1032,1032,1032,1032&tos=1032,0,0,0,0&p=438,968,688,1268&mcvt=1032&rs=3&ht=0&tfs=1178&tls=2210&mc=1<e=1&bas=0&bac=0&met=no&avms=nio&niot_obs=899&niot_cbk=957&md=2&lm=2&rst=1571559411778&rpt=147&isd=0&msd=0&oseid=3&xdi=0&xosd=1&ps=1618%2C6899&ss=1600%2C1200&pt=1583&bin=1&deb=1-2-7-15-20-14-135-18-0-0-0&tvt=2202&r=v&id=osdim&vs=4&uc=10&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191014
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
659 B
|
31ms
30ms
|
Image
image/gif |
54.246.164.155
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
308 B
|
140ms
140ms
|
Image
image/gif |
104.244.37.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=331316&asId=9c19bb53-d197-2bdf-f646-12fc7e91b354&tv={c:rzDFFK,pingTime:1,time:1036,type:p,clog:[{piv:94,vs:i,r:,w:300,h:600,t:18}],es:0,sc:1,ha:1,gm:1,slTimes:{i:1036,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1318.121.300.600,am:i,cc:1318.121.300.600,piv:94,obst:0,th:0,reas:,bkn:{piv:[1031~75],as:[1031~300.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:137,fm:rFqv8h5+11|12|1311|1312|1313|1314|14|151|1611|17|18|19|1a|1b|1c|1d|1e|1f|1g|1h|1i.346702-39754026|1i1|1j|1k|1l1|1l2|1m|1n*.331316-39077540,idMap:1n*,rend:1,renddet:IMG.qs,rmeas:1}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.37.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- daldt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame FB60
|
42 B
110 B
|
15ms
14ms
|
Image
image/gif |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssIxO6lkHlZ5TDyIfnGzHfvIHfLB3nERr74nju3UwurrpJK6d5158MdsQAFx8ueiWNqS5P4zK6u-J0188Oc5xiJEIE9p7GfK3Q1oJOsXxg&sig=Cg0ArKJSzBza46-jmZm6EAE&adk=946476008&tt=833&bs=1585%2C1185&mtos=0,1032,1032,1032,1032&tos=0,1032,0,0,0&p=121,1318,721,1618&mcvt=1032&rs=3&ht=0&tfs=1383&tls=2415&mc=0.89<e=0.89&bas=0&bac=0&met=no&avms=nio&niot_obs=1203&niot_cbk=1208&md=2&lm=2&rst=1571559412082&rpt=129&isd=0&msd=0&oseid=3&xdi=0&xosd=1&ps=1618%2C6899&ss=1600%2C1200&pt=1583&bin=1&deb=1-2-7-17-22-14-149-20-0-0-0&tvt=2407&r=v&id=osdim&vs=4&uc=10&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191014
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 67BD
|
42 B
110 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:81b::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstPAFtLIOqdp8vZPrXbeEuU24IGDnlWvh5jrPUkGSiajWLnWorWd0lFxN37w6dOP_TZwncKesvfhqw2pulpilE&sig=Cg0ArKJSzLpGUz7IuVgVEAE&id=lidar2&adk=1&p=0,0,250,300&tos=1095,0,0,0,0&mtos=1095,1095,1095,1095,1095&mcvt=1095&rs=5&tfs=239&tls=1334&mc=1<e=-1&bas=0&bac=0&met=no&avms=nio&niot_obs=136&niot_cbk=154&lm=4&xosd=1&bs=1585,1185&ps=1618,6899&ss=1600,1200&tt=1202&pt=134&bin=2&deb=1-1-1-2-11-0-0-11-0-0-0&tvt=1199&iframe_loc=https%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F&is=300,250&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&itpl=0&r=v&v=20191014
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
5180893370
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
44 B
248 B
|
7ms
6ms
|
XHR
application/json |
35.158.187.39
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame 4158
|
24 B
409 B
|
809ms
1ms
|
XHR
application/octet-stream |
148.251.51.163
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEt1dGFlY2hlZGllUG9ZYWk9S3V0YWVjaGVkaWVQb1lhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5TbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5rdShtKTthLmp1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5zdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3I9dGhpcy5hWzddO3RoaXMub2o9dGhpcy5hWzNdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuSGo9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzddO3RoaXMuRGw9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzEwXTt0aGlzLkJwPXRoaXMuYVszXTt0aGlzLlJqPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMucHM9YjtiLnByb3RvdHlwZT17VnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53djp0aGlzLkdqKGEpfSwKR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkhqOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Objp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnA6dGhpcy5DbChhKX0sQ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRsOnRoaXMubnMoYSl9LG5zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5vczp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnA6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5wc3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuVnIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuU289CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk9jPVtdO3RoaXMub2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5DdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuU2c9e307dGhpcy5lZj0hMX1jLm1rPWI7Yi5wcm90b3R5cGU9e1B1OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWmI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5TZ1thXSYmKHRoaXMuU2dbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5QdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxhbzpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sQ3Q6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuQnQoYS5kYXRhKX0sQnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0saGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0scGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5IZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMua2goYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEhnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxabjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUubXEoYSkpcmV0dXJuOyhiPXRoaXMucGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxtcTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LElyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHllOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sR2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG9mOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxHZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LEVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwkaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwkcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxMbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx5bjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmNsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxDbzpmdW5jdGlvbigpe3JldHVybiBhLkppKCl8fGEuJGkoKXx8YS4kcSgpfHxhLkxsKCl8fGEueW4oKXx8YS5jbCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5DbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LCRiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LEdxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx5cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxIdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxDZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuZGkoYikrIjoiK3RoaXMuZGkoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxnZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHpnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5lZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LENjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy56ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkNjKEIpfSxFdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkdxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sSXU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlpiKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5lZShhKX0sZWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uS2MoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLktjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LE1kOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uS2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTWU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uYnAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSw1MDApfSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5IZShhKXx8dGhpcy5JcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmRmJiZ3aW5kb3cuc2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnhnKGEpKXJldHVybiB0aGlzLnhnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5abihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LGpzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmtoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGxoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5qcyhmLnNkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuT2M9YX0saXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEhvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5ta3x8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMubGs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi50dD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Hcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmJxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ZZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5RZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlZmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlpmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Sbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5UZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5jcT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmZkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuemM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlhmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Ubj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlhjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5hZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5jZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuU249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmtpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuSXM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi52ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5jdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuSHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmxrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp0PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbNV07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy5HdT10aGlzLmFbNF07dGhpcy5McD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLllsPWI7Yi5wcm90b3R5cGU9e3l0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56dDp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVzOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zazp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdvOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HdTp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTHA6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5ZbHx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMueXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5uaz1iO2IucHJvdG90eXBlPXtBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCsKbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxCcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxuZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubmQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5uZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPQphLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxrYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMubGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sdHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkJxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubmQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMubmt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmhsPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs3XTt0aGlzLnF3PXRoaXMuYVs5XTt0aGlzLkN1PXRoaXMuYVs0XTt0aGlzLkF1PXRoaXMuYVsxMF07dGhpcy5pdD10aGlzLmFbNl07dGhpcy5mdz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs2XX1jLnByPWI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5obDp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXI6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF3OnRoaXMuQnUoYSl9LEJ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5DdTp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQXU6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml0OnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLnByfHxrYSx3Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5nbCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PQp0eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MubGo9Yn0pKGMpO3ZhciBMPWMubGp8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnY9dGhpcy5hWzJdO3RoaXMudnM9dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMV19Yy4kcD1iO2IucHJvdG90eXBlPXtxdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnY6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ocjp0aGlzLlZtKGEpfSwKVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLldtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy4kcHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMucXYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5lbT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5sdShiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLAp0aGlzLkxjKSl9LGF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0senE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0uT3UoYil9LGZ4OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxEcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHh4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09Cm51bGx9fSl9KShjKTt2YXIgdD1jLmVtfHx0OyhmdW5jdGlvbihjKXtjLmdtPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSx2dTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxvdTpmdW5jdGlvbihiKXt0aGlzLlBlPQpifSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSwKRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSx6eDpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5TcSgpfHx0aGlzLlZuKCk7dGhpcy5EZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LFZuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJgpiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LGp4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSx1eDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYXg6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZ218fHA7KGZ1bmN0aW9uKGMpe2Mud2k9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy5Jbj0iMyI7dGhpcy5UYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdOwp0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5tdShhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHNyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldPwp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnNyKCk7aWYoIXRoaXMuQXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksCnRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sCnc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LHR1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Jbn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sUnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlRjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LG11OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx6cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LG1zOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy53aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUW49dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzZdO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMudms9YjtiLnByb3RvdHlwZT17UG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFuOnRoaXMuQ3AoYSl9LENwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EcDp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy52a3x8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuUG4oNCk7KGZ1bmN0aW9uKGMpe2MuVmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuVmp8fG9hOyhmdW5jdGlvbihjKXtjLldqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5TdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0KITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgcGE9Yy5Xanx8cGE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuWGp8fHFhOyhuZXcgcWEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UcD10aGlzLmFbOF07dGhpcy5UaT10aGlzLmFbMl07dGhpcy5Mbj10aGlzLmFbMl07dGhpcy5ubT10aGlzLmFbNF07dGhpcy55bz0KdGhpcy5hWzVdO3RoaXMuUXI9dGhpcy5hWzddO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuTm89dGhpcy5hWzVdO3RoaXMuTmw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5odj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHA6dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRpOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5tOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueW86dGhpcy5QcihhKX0sUHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFyOnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sdzp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5NbyhhKX0sCk1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmh2fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5TcCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3RoaXMud2coKTt0aGlzLnlnKCk7dGhpcy5wcD0hMX0sd2c6ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5jYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj0KYi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuY2M9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmCnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiYKYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sCnVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Pa3x8c2E7KGZ1bmN0aW9uKGMpe2MuTms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmCihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5WYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJgpiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS55ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuVmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5vaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLldjLmluZGV4T2YoYSkmJgp0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5XYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sbXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2Uub2YoYS52aWRlb1RhZyk/YS5jYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlZjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Oa3x8dGE7KGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy53cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkRyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCndxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Qa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLm9xPXRoaXMuYVszXTt0aGlzLm93PXRoaXMuYVszXTt0aGlzLmxwPXRoaXMuYVs3XTt0aGlzLnl2PXRoaXMuYVs4XTt0aGlzLkpwPXRoaXMuYVszXTt0aGlzLnRvPXRoaXMuYVsyXTt0aGlzLlltPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLiRrPWI7Yi5wcm90b3R5cGU9e0VsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GbDp0aGlzLm5xKGEpfSxucTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3E6dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm93OnRoaXMua3AoYSl9LAprcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHA6dGhpcy54dihhKX0seHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnl2OnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcDp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG86dGhpcy5YbShhKX0sWG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlltOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy4ka3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MubW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZmk9ITA7dGhpcy51Yz10aGlzLldnPSExO3RoaXMuRXMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnJoKCksdGhpcy5ZbygpLHRoaXMucmIoKSl9LEVzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LHZ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwKIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT8KYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwKIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5pZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sClliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxKZzpmdW5jdGlvbigpe2lmKCF0aGlzLkZjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LEJyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuenIoKTt3aW5kb3cuaW1hJiZiJiYKKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LHpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy4kYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuJGM9ITApO3JldHVybiB0aGlzLiRjfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWWIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5UdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsCiEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxUdDpmdW5jdGlvbigpe3RoaXMudWM9ITA7dmFyIGI9dGhpcy5KZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIiwKZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5vZyYmYi5hZHMmJih0aGlzLm9nPWIuYWRzKTtyZXR1cm4gdGhpcy5vZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpOwp0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5CcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlliKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlliKCksdGhpcy51Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOgoodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5abygpfS5iaW5kKHRoaXMpLAoxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxncDpmdW5jdGlvbigpe3RoaXMua3h8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSwKd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlF2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuJHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sJHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5sbnx8eWE7KGZ1bmN0aW9uKGMpe2Mubm49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTsKdmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbT10aGlzLmFbMV07dGhpcy5Qaj10aGlzLmFbMTBdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMuUnA9dGhpcy5hWzJdO3RoaXMuSHA9dGhpcy5hWzJdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMubm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5Daj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY206dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBqOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdjp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnA6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMueHcoYSl9LAp4dzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXc6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5Danx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuYm0oNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTsKcmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sdXQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueWQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCkFhOmZ1bmN0aW9uKCl7dGhpcy5WZSsrO2lmKDEwPHRoaXMuVmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBDYT1jLlJsfHxDYTsoZnVuY3Rpb24oYyl7Yy5RbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9CiEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7CnZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuZnE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLmZxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IudXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBEYT1jLlFsfHxEYTsoZnVuY3Rpb24oYyl7Yy5TbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYKKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlNsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG89dGhpcy5hWzddO3RoaXMuTGk9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzldO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuVXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Lcj1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5MaTp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucm86dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JaTp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLktyfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5Pbyg0KTsoZnVuY3Rpb24oYyl7Yy5Maz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5HZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmCihhPWEucGFyZW50Tm9kZSl9dGhpcy5BdD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQXQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7CnRoaXMubGQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5sZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZwOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmxkKTtlLkZlKHRoaXMubGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuTGt8fEhhOyhmdW5jdGlvbihjKXtjLktrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5HKCEwKX19KX0pKGMpO3ZhciBJYT1jLktrfHxJYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBiPQpsLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5Na3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5qPXRoaXMuYVs0XTt0aGlzLkpvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuVmw9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSm86dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5WbHx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuTWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLm9rPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG51OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sV246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5va3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsCmQsZil7dGhpcy4kYT1hO3RoaXMuQmc9dGhpcy5vaT0hMTt0aGlzLnNoPWQ7dGhpcy5TaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeihhKSk7dmFyIGM9dGhpcy5nYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5JZSh0aGlzLiRhLnVybCkmJm0uT2Qpe3ZhciBlPW5ldyB6KGEudXJsKTtlLm51KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMucGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQmcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuZ2IudXJsQ2FsbGVkPXRoaXMuJGEudXJsO3RyeXt0aGlzLlNoP3RoaXMuZ2Iub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLm9pfHwodGhpcy5nYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJgp0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmdiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5JZSh0aGlzLiRhLnVybCk/bS5PZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkllKHRoaXMuJGEudXJsKSx0aGlzLnNoJiZ0aGlzLnNoKCl9cmV0dXJuIHRoaXMuZ2J9fX0pKGMpO3ZhciBNYT1jLnBrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5XZD0hMX1jLm1qPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3RoaXMuV2Q9YX0scXU6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtCdzoiQWRDbGlja1RocnUiLER3OiJBZEVycm9yIixFdzoiQWRTdG9wcGVkIixIdzoiQWRMaW5lYXJDaGFuZ2UiLEl3OiJBZFRhZ1BhcnNlZCIsTHc6IkFkVmlkZW9Db21wbGV0ZSIsT3c6IkFkTG9hZGVkIixQdzoiQWRTa2lwcGVkIixRdzoiQWRTdGFydGVkIixGdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEd3OiJBZEltcHJlc3Npb24iLEN3OiJBZENyZWF0aXZlVmlldyIsSnc6IkFkVmlkZW9NaWRwb2ludCIsS3c6IkFkUGF1c2VkIixNdzoiQWRWaWRlb1N0YXJ0IixOdzoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmEodGhpcy5XZCxiW2RdKX0sWHQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlZkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlZkKXRoaXMuSGEuVmQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlZkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldkJiZ0aGlzLll0KCk7dGhpcy5IYSYmdGhpcy5YdCgpfX19KShjKTt2YXIgTmE9Yy5tanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPQohMTt0aGlzLnhjPSIiO3RoaXMuamU9dGhpcy53Yz10aGlzLndiPW51bGw7dGhpcy56cD10aGlzLkpiPXRoaXMuamg9ITE7dGhpcy5MYT0iIjt0aGlzLmVoPSExO3RoaXMud2E9dGhpcy5xZD0iIjt0aGlzLiRnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLmFmPSExO3RoaXMucGE9W107dGhpcy5QZz10aGlzLmdjPSIiO3RoaXMucmU9ITE7dGhpcy5zZj0wO3RoaXMuSGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMub2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmljPSIiO3RoaXMuamM9W107dGhpcy5rYz1bXTt0aGlzLktkPVtdO3RoaXMuaGM9IiI7dGhpcy50Zj0KMDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5FYz0hMTt0aGlzLmhwPXRoaXMuUWQ9bnVsbDt0aGlzLk5oPXRoaXMubWM9dGhpcy50Zz10aGlzLndmPXRoaXMuT2Q9dGhpcy5sZT10aGlzLlVjPSExO3RoaXMuaWI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucmQ9MDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuYmQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5QZj0iIn1jLnFrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMueGMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy53YyxhZHRhZ3JlZ2V4OnRoaXMuamUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuamgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuenAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCwKY2xpZW50Q29uZmlnOnRoaXMud2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLiRnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmdjLGhvbWFkQWRwYXRoOnRoaXMuUGcsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5yZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5zZixIT01BRF9WRVJJRklFRDp0aGlzLkhmLEhPTUFEX0JMT0NLRUQ6dGhpcy5GZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5vYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuR2YsdGVzdEhpZGU6dGhpcy5pYyx0ZXN0VGFnczp0aGlzLmpjLHRlc3RUYWdzSlM6dGhpcy5rYyx0ZXN0VGFnc1hIUjp0aGlzLktkLHRlc3RDb29raWU6dGhpcy5oYyx0aHJvdHRsZTp0aGlzLnRmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlVjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMubGUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuT2QsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMud2YsY29uZmlnRmFpbHVyZXM6dGhpcy5pYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5LaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMua2IsdnBhaWQ6dGhpcy5tYyxza2lwQWxsb3dlZDp0aGlzLk5oLHZtYXBzOnRoaXMubGksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLmJkLGFkRmFsbGJhY2tVUkw6dGhpcy5QZn19LFFxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmliKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaWJbYl0mJjE9PXRoaXMuaWJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5IbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkhlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkdjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5LYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnhjfHx0aGlzLndifHx0aGlzLndjfHx0aGlzLmplKSYmKGc9dGhpcy54cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnlxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5HYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sR2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuSGUoYSk7cmV0dXJuIGJ9LHlxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5YdztyZXR1cm4ibm9uZSJ9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5LaF19LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZCgpLGI9dGhpcy5NaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxwaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx3czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5waChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMucGgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx4czpmdW5jdGlvbihhKXt0aGlzLnhjJiYoYSs9dGhpcy54Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMud2MmJihhPXRoaXMud3MoYSx0aGlzLndjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi5ydShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIucXUoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZWg9ITA7dGhpcy5xZD1hO3RoaXMud2E9Yjt0aGlzLmFmPWQ7dGhpcy5RZD1mO3RoaXMuQmM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmhzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuZnMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueWMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLnFkK3RoaXMuZ2UoImdsb2JhbCIpKSx0aGlzLk1xLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LGZzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZ2UoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy55Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGdlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmxlKXt0aGlzLmxlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkJjPSExKTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuJGc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkZmKSk7dGhpcy5OYigpO2UuQ2Moay50dCk7KGI9ZS4kYih0aGlzLnNkKCkpKXx8KGI9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sTXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmdjfHx0aGlzLkxhfHx0aGlzLnljKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHljOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuR2MoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmdjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuUGc9YS5hZHBhdGh8fCIiO3RoaXMucmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5LaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkhjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxIYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLktjKCkpLGQ9dGhpcy56YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMuZ2UoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlJ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjdXN0b21lciIpO2E/dGhpcy55bT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLnltPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5IYyghMCl9LmJpbmQodGhpcyksITApfX0sUnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5FYz0hMDt0aGlzLkhjKCEwKTtyZXR1cm59fXRoaXMuT2Q9dGhpcy5NYihiLnN0cmljdCk7dGhpcy53Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5rYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5LZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy53Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuamU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuamg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubWM7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmNkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5saT1iLnZtYXBzfHwiIjt0aGlzLmJkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5QZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkZxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5yZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy50Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5FYz0hMCx0aGlzLkhjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLktkKT90aGlzLmFmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMubmUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmtkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFBjOmZ1bmN0aW9uKGEpe3RoaXMuVWM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKGEpKSx0aGlzLk5iKCksdGhpcy5uZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmljKXt2YXIgYT1lLmtkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5paCgpKXRoaXMuUGModGhpcy5vYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuV2goKX19ZWxzZSB0aGlzLldoKCl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5wZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuS2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBmKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxXaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVmguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVmgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxwZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMuc2YrKyx0aGlzLkRhKG5ldyB6KHRoaXMuaGMpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMucWYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5UaCgpfSxxZjpmdW5jdGlvbihhKXt0aGlzLlBjKHRoaXMuR2YsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5zZj90aGlzLnBmKCk6dGhpcy5xZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlRoKCk6dGhpcy5xZigiQUFBIil9LFRoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubmUoKX0saWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlVjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmloKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5IZikpO3RoaXMuUWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5RZCYmdGhpcy5RZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMud2YmJnRoaXMuUXEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sJGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEub2k9ITApO3EmJmUuRXIoKSYmKGEuQmc9ITApO2cmJihhLlNoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmJiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5HYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sVXU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmxpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLkl2LmJpbmQodGhpcyksdGhpcy5Idi5iaW5kKHRoaXMpKX0sSXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LEh2OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkNjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG5lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmJiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sa3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sRnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5xa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLmpsPXRoaXMuYVs4XTt0aGlzLk9yPXRoaXMuYVs3XTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLk5wPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuYXE9YjtiLnByb3RvdHlwZT17d2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9yOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXI6dGhpcy5NcChhKX0sTXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5wOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7CnZhciBQYT1jLmFxfHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy53ayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWWcmJmEuZi5ZZyh7cGF1c2U6dGhpcy55ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMudXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLldiPXRoaXMuYWQ9ITE7dGhpcy5Cbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlJvPWUuYWEoMTApOwp0aGlzLm1mPTA7dGhpcy5aYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlpjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLlpjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudGg9dGhpcy5HZD0hMTt0aGlzLm1oPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYmM9ITE7dGhpcy5ycD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SZD0KdGhpcy5PYj10aGlzLnBlPXRoaXMuZ2Q9dGhpcy5JZD10aGlzLnNiPXRoaXMubmM9dGhpcy52aD10aGlzLm1kPXRoaXMubHY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMuc2M9W107dGhpcy5kYz17fTt0aGlzLmp0PTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy54ZD17fX1jLmtrPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5LdSgpO2UudihrLlRuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9CmM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuY3AoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubWgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLkxlKGEsYixjKX0sNTApfX0sV2U6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5tZD0hMTt0aGlzLmM9YTt0aGlzLnd1KHRoaXMuYyk7dGhpcy54ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTWcoYSk7dGhpcy5zYz10aGlzLkRnKGEpO3RoaXMubXAoKX0sTWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSGQ9dGhpcy5JcShhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkRnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuc3EoYSkpKTtyZXR1cm4gY30sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LElxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuamQmJmEuamQuZXJyb3ImJmEuamQuZXJyb3IuY29kZSYmCihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUcuWGQuY29kZT9lLnYoay5kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLk1lKCksYj09Ry5LZi5jb2RlJiZlLnYoay5Gcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5icSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTHUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5JZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTGYuY29kZTplLnYoay5ndyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLmh3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuR3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWGIoYSk7dGhpcy5SYSgpfSxYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9CmEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy4kZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLnd4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuYm8mJnRoaXMucGxheWVyLnZlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci52ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuWG4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLiRlJiZiLmxvYWQoKTtpZih0aGlzLlhoKGIpKXt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLiRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuJGU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm5wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy51dSgpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSx1dTpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiYKdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5hbyh0aGlzLmMub3JpZ2luLnZhKTt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLndoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuTHEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsCmRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmCiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5hYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5zYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVHYoKSx0aGlzLmIuYWMoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuWHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLmF3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT0KYS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlZiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuTC5iZHx8dGhpcy5RYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmCnRoaXMuVXYoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmZjKCkpLHRoaXMuVnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuaGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LFZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuWGMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uYz0hMX0sWHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxXdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxUdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7ZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5tZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7CmUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LCR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTsKZS5vZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sU3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmN3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5taSghMCl9LFhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIiwKYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpOwphLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2J8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5CbykpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5hZCYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLmFkPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5DZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLAp0aGlzLlphKCksITApLHRoaXMuTC50Z3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuTXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuTHYoKTt0aGlzLmhpKCk7dGhpcy5lZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmdkfHx0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZ2R8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLlJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxVbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSXUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmCnRoaXMuYy5TZCYmdGhpcy5Vbih0aGlzLmMuU2QpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5SZHx8KGUudihrLklzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucWMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLldiPXRoaXMuYWQ9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5JZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOgp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxQdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLldiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5hcCgpO3RoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5sdil0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5JZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT0KTWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnB2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi0KYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLldiPXRoaXMuYWQ9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5aYy5yZXBsYWNlKCJbdGltZV0iLAplLkNnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy52aHx8KHRoaXMudmg9ITAsdGhpcy5tZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHB2OmZ1bmN0aW9uKGEpe2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksCnRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5tZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmNpPWEpfSxQaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sS3U6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxMdTpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSwKWGE6ZnVuY3Rpb24oYSl7ZS5NZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5DZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMueGQmJnRoaXMueGQudHJhY2smJnRoaXMueGQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSnEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYKKHRoaXMua2U9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5IZC5pbXByZXNzaW9ucyYmZS5DcihnLnVybCx0aGlzLkhkLmltcHJlc3Npb25zKT90aGlzLktlKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Tbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnhwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09CnR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuV24oYyksZnx8KGY9dGhpcy5zZyksZXx8KGU9dGhpcy5zZyksdGhpcy5ZbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx4cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09CmJ9KX0sTXY6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLk52LmJpbmQodGhpcykpfSxOdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVmImJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sCkx2OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTsKdmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmNkJiYoYj10aGlzLkwuY2QpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmMuaWQ9dGhpcy5ycDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpOwp2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm52LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubXYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjsKYy5hcHBlbmRDaGlsZChmKTt0aGlzLmMubGYmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsCmIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlFlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5uYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSx5ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sbXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LG52OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuZ2R8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5rZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnRofHwhdGhpcy5MLlVjJiYic3BpZWdlbC5kZSIhPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5nZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm5nKCkpOih0aGlzLnRoPXRoaXMuUWM9dGhpcy5EZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmtlPSEwLGE9ZS5kZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5MZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbmc6ZnVuY3Rpb24oYSl7dGhpcy5OdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoITApfS5iaW5kKHRoaXMpLHRoaXMuanQpOih0aGlzLklkPSEwLHRoaXMuYi5CZSgpLHRoaXMuYi5idSgpLHRoaXMuYmM9ITEsCmUudihrLnFwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy54ZSgpLkdoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5WYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnNjJiYwPHRoaXMuc2MubGVuZ3RoJiYoYS5hZElkcz10aGlzLnNjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5SbysiLSIrdGhpcy5tZjt0aGlzLmMmJnRoaXMuYy5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ra3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLm50PXRoaXMuYVsyXTt0aGlzLnV3PXRoaXMuYVs0XTt0aGlzLmNuPXRoaXMuYVs5XTt0aGlzLnVwPXRoaXMuYVs3XTt0aGlzLmtqPXRoaXMuYVsyXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLlVrPXRoaXMuYVs0XTt0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfQpjLnN2PWI7Yi5wcm90b3R5cGU9eyRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hczp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm50OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51dzp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY246dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnVwOnRoaXMuamooYSl9LGpqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Vazp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5zdnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuJHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnJjPXRoaXMudGM9ITE7dGhpcy52YT0iIjt0aGlzLkJmPSExO3RoaXMuVGc9IiI7ZCYmZC5lbXB0eT90aGlzLmxzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2Mua249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUua2QoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnBnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkpkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5rcy5iaW5kKHRoaXMpLAp0aGlzLmdzLmJpbmQodGhpcykpfSxFZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5IcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxIcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGtzOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpOwp0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlRnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sbHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPXRoaXMuRWcoKTt0aGlzLnRjPXRoaXMucmYoKTt0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LGdzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSWYse2RlcHRoOmF9KSl9LEpjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuSnIoKT90aGlzLmZ2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTmcoKSxoLHtBZFN5c3RlbTp0aGlzLnJxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5MZikpOihhPTAsdGhpcy5EdigpJiZ0aGlzLldlKHRoaXMuc3AoKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMudGM/KHRoaXMudGM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQuUmUoKX0scWg6ZnVuY3Rpb24oKXt0aGlzLnJjPyh0aGlzLnJjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LnFoKCl9LER2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3YoKT90aGlzLmJ2KCk/ITA6KC0xIT10aGlzLkRjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVGQpKTp0aGlzLnNhKHRoaXMuU2Eody5FZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuU2MsRy5LZikpLCExKX0sV2U6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuU2R8fChhLlNkPVtdKTthLlNkLnB1c2godGhpcy5UZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk5lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnRjO2EucWM9YS5xYz9hLnFjOnRoaXMucmM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMucGFyZW50LldlKGEpfSxzcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkRjKCk7YS5PPXRoaXMuS2coKTthLlZiPXRoaXMudHEoKTthLkt2PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMucXEoKTthLmxmPXRoaXMuSHEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMudXEoKSk6Yi5QYS5jb25jYXQodGhpcy5DcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LlhiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuWGImJnRoaXMucGFyZW50LlhiKGIpLGE9MCx0aGlzLkpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sWGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuWGIoYSl9LHVnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGZ2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sY3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxidjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuRGMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVWg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnJmKCkmJihhPSEwKTtyZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEpyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuYWgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSx1cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sS2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksWXc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucGQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxEYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5IdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5rbnx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5acT10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLkh0PWI7Yi5wcm90b3R5cGU9e1lxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWnE6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuSHR8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLllxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuVmI9IiI7dGhpcy5CPXRoaXMucWM9dGhpcy50Yj0hMTt0aGlzLkNlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5EZT0iIn1jLmRtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LEFxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLApiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLkFxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5EZT1hfSxMcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuZG18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVs0XTt0aGlzLnFsPXRoaXMuYVs5XTt0aGlzLkVpPXRoaXMuYVsxMF07dGhpcy5icj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlNrPQpiO2IucHJvdG90eXBlPXtwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Ta3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMucHQoNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsCk9hOiJEVVJBVElPTl9FUlJPUiJ9LFNjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LExmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx6dzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LEF3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmRyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuaXI9YjtiLnByb3RvdHlwZT17Y3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5pcnx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuY3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5lcnJvcj1hO3RoaXMuamQ9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Taj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuU2p8fFVhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJqPXRoaXMuYVszXTt0aGlzLlNyPXRoaXMuYVs1XTt0aGlzLldrPXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNF07dGhpcy52cj10aGlzLmFbNV07dGhpcy5jcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5abD1iO2IucHJvdG90eXBlPXtBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5ScihhKX0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNyOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xazp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy51cihhKX0sCnVyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52cjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLlpsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Baig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5Pdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLm9sPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLnN4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlJ0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxvdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy52cShhKSl9fSx2cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntCeDohMCxBeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntveDoidmlkZW8iLER4OiJqc0N1c3RvbSIsRXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRng6MSxadzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEtxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5vdDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLktxKGIpLHZlbmRvcjpifSk7CnRoaXMuSnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk92Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxWbzpiLHl4OiExfSl9LEp1OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Gcnx8KGEucngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5vbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzVdO3RoaXMuam09dGhpcy5hWzJdO3RoaXMuWG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzEwXX1jLnBqPWI7Yi5wcm90b3R5cGU9e0VrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gazp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5wanx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuRWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXtwcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnBxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5WcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUXU6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZmQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFZxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxpcTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnFqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLlVvPXRoaXMuYVs2XTt0aGlzLkNpPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuY3U9YjtiLnByb3RvdHlwZT17ZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5lbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW86dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuJGwoYSl9LCRsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuY3V8fGJiLExjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmRuKDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSwKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSwKRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuSmx8fGNiOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPQohMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLmdxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5iYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmRkKCk7dGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sCmtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxMZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxnZzpmdW5jdGlvbigpe2lmKHRoaXMuZGQoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTsKdGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuV3d9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSwkdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5teCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuRGMoKTotMX0sRHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sZ3E6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksCjEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5EcShiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLklsfHxkYjsoZnVuY3Rpb24oYyl7Yy5LbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEdyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmhtLkpuLkhuP3dpbmRvdy5PTy5obS5Kbi5Ibi5VdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPQpkYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLktsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzhdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLlR1PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLmd1PWI7Yi5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QbDp0aGlzLmtxKGEpfSwKa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxxOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5UdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuZ3V8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLk9sKDQpOyhmdW5jdGlvbihjKXtjLllpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2coKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSwKemg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLllpfHxoYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5oZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLlhpfHxpYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5EZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksCnRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuaHF8fCh0aGlzLmhxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuQ2god2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLlppfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdD0KdGhpcy5hWzEwXTt0aGlzLlpwPXRoaXMuYVsxMF07dGhpcy5aaj10aGlzLmFbNF07dGhpcy5Tcz10aGlzLmFbMl07dGhpcy5ndD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLkRqPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnA6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpqOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tczp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkRqfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TmMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSwKTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLkxtfHxVOyhmdW5jdGlvbihjKXtjLkttPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTnMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlBxKCl9LE5zOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLkttfHxWOyhmdW5jdGlvbihjKXtjLk1tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPQpbXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy53ZCYmKGI9ZS55cChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksCnRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFljOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LGd2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5hdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSwKUHE6ZnVuY3Rpb24oKXtpZih0aGlzLkljKWZvcih2YXIgYj0wO2I8dGhpcy5JYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkljW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5ndihiKX19KX0pKGMpO3ZhciBsYj1jLk1tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Ncz10aGlzLmFbNV07dGhpcy5Vaj10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbMl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy54cj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5IbD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5xcj1iO2IucHJvdG90eXBlPXtMczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXM6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVqOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sazp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpvOnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHI6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnFuOnRoaXMua28oYSl9LGtvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sbzp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnFyfHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5Mcyg0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHwKb2I7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5XaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVsPXRoaXMuYVs5XTt0aGlzLkFvPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsyXTt0aGlzLld1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLk5pPXRoaXMuYVszXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuTm09YjtiLnByb3RvdHlwZT17dGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnVsOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbzp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc3Q6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLld1OnRoaXMua3QoYSl9LAprdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubHQ6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5OaTp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSms6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuTm18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnRsKDQpOyhmdW5jdGlvbihjKXtjLndsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVyhiKTt0aGlzLlooYSk7dGhpcy5RdCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLm11dGUmJnRoaXMuamEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxZZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLndsfHxzYjsoZnVuY3Rpb24oYyl7Yy52bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmCiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm9hKCkpO2EuS2EoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIHRiPWMudmx8fHRiOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMueGx8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy53aj10aGlzLmFbMV07dGhpcy5qaz10aGlzLmFbMl07dGhpcy5zbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLlNtPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2o6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmprOnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU218fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmdqKDQpOwooZnVuY3Rpb24oYyl7Yy53bj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LApOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLndufHx3YjsoZnVuY3Rpb24oYyl7Yy52bj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sT3Q6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj0KW10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudWM9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5PdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpOwpyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnZufHx4YjsoZnVuY3Rpb24oYyl7Yy54bj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7CnRoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLnhufHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG09dGhpcy5hWzZdO3RoaXMuS3M9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy54aj1iO2IucHJvdG90eXBlPXtDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lczp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy54anx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkNtKDQpOyhmdW5jdGlvbihjKXtjLndtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy52dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LE11OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMud218fEJiOyhmdW5jdGlvbihjKXtjLnZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ycz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5ycz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMudm18fENiOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMueG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbMl07dGhpcy51bT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmlqPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbzp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmlqfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuRG8oNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5wbXx8R2I7KGZ1bmN0aW9uKGMpe2Mub209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLm9kKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5acigpOnRoaXMuamcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuU2YoKXx8dGhpcy5tKCEwKX0sWnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5UdyYmYi5WdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMub2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0sb2Q6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LApueDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5vZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLm9tfHxIYjsoZnVuY3Rpb24oYyl7Yy5xbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMucW18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMTBdO3RoaXMueHQ9dGhpcy5hWzNdO3RoaXMuc2o9dGhpcy5hWzldO3RoaXMud3A9dGhpcy5hWzldO3RoaXMuQmw9dGhpcy5hWzddO3RoaXMuRm09dGhpcy5hWzZdO3RoaXMuUHA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy53bz1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnh0OnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLndwOnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbDp0aGlzLkVtKGEpfSxFbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRm06dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy53b3x8S2IsVGM9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuV3AoNCk7KGZ1bmN0aW9uKGMpe2MubGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sbHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sS2E6ZnVuY3Rpb24oKXt2YXIgYjtIPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPWMubGx8fFg7KGZ1bmN0aW9uKGMpe2Mua2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5ZZSYmYiE9dGhpcy5ZZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLmZhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS50eCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMua2x8fFk7KGZ1bmN0aW9uKGMpe2MubWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0g9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihIKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMubWx8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpsPXRoaXMuYVs1XTt0aGlzLm9yPXRoaXMuYVsxXTt0aGlzLkxqPXRoaXMuYVsxMF07dGhpcy5lbz10aGlzLmFbOV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5qdj10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbM107dGhpcy5Hbj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs0XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3lsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3I6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Majp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZW86dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFpOnRoaXMuaXYoYSl9LGl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuanY6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnJyfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy5naz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApodTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0scXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5na3x8T2I7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5ma3x8UGI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTsKaWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5oa3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLmF0PWI7Yi5wcm90b3R5cGU9e1ZzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Xczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMuYXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5Wcyg0KTsoZnVuY3Rpb24oYyl7Yy5Cbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxOZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sClB0OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlJjJiYodGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJjPSExKSx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksCiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuQm58fFRiOyhmdW5jdGlvbihjKXtjLkFuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksCmImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE9mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pOwp0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLlN0KCl9LFN0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYil7dGhpcy5VYihiKX0pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuTnQ9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5Bbnx8VWI7CihmdW5jdGlvbihjKXtjLkNuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuUHQoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLkNufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJrPXRoaXMuYVsxMF07dGhpcy55aT10aGlzLmFbNF07dGhpcy5SbT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLiRqPWI7Yi5wcm90b3R5cGU9e0FrOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuQms6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuJGp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkFrKDQpOyhmdW5jdGlvbihjKXtjLiRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuRHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGh1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Ec30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYodGhpcy54aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuJG18fE87KGZ1bmN0aW9uKGMpe2MuWm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy50dSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuWm18fFA7KGZ1bmN0aW9uKGMpe2MuYW49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYW58fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5PcT10aGlzLmFbMl07dGhpcy5SaT10aGlzLmFbM107dGhpcy5mbD10aGlzLmFbMV07dGhpcy5rcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLm5sPWI7Yi5wcm90b3R5cGU9e05xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmk6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ubHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuTnEoNCk7KGZ1bmN0aW9uKGMpe2MuWWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Za3x8WjsoZnVuY3Rpb24oYyl7Yy5Yaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLlhrfHxhYTsoZnVuY3Rpb24oYyl7Yy5aaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLlprfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGo9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtjajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLk9zfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5jaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5ia3x8ZGM7KGZ1bmN0aW9uKGMpe2MuYWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5ha3x8ZWM7KGZ1bmN0aW9uKGMpe2MuY2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLmNrfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmw9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuWHE9CnRoaXMuYVsxXTt0aGlzLllzPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs0XTt0aGlzLnRzPXRoaXMuYVsxXTt0aGlzLkVuPXRoaXMuYVsxMF07dGhpcy5HdD10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbNV07dGhpcy56cz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLnR2PWI7Yi5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemo6dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhxOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zczp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSGs6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRzOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Fbjp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLkd0OnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5KbTp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnR2fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hbCg0KTsoZnVuY3Rpb24oYyl7Yy5yaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubWUoKTt0aGlzLmZnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LApFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwOwppZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfSxtZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJgpiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD8KdGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzddO3RoaXMuQ3Y9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMuRmo9dGhpcy5hWzEwXTt0aGlzLnd3PXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVs5XTt0aGlzLnVuPXRoaXMuYVs0XTt0aGlzLkhtPXRoaXMuYVszXTt0aGlzLlBpPXRoaXMuYVs0XTt0aGlzLmxtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQXM9YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJqOnRoaXMuQnYoYSl9LEJ2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnl1Ogp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy52dyhhKX0sdnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnd3OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW46dGhpcy5HbShhKX0sR206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IbTp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5Bc3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuYWooNCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuZm09YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5FcShhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLAp0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMuemQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0sT3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMuemQubGVuZ3RoO2ErKyl0aGlzLnpkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5mbXx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs5XTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLlVsPXRoaXMuYVs2XTt0aGlzLllyPXRoaXMuYVs3XTt0aGlzLlVxPXRoaXMuYVs2XTt0aGlzLkx0PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs0XTt0aGlzLkdpPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLmpxPWI7Yi5wcm90b3R5cGU9e3lrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56azp0aGlzLnVvKGEpfSx1bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudm86dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVsOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zcjp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5MdDp0aGlzLldsKGEpfSxXbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhsOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuanF8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLnlrKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoKIiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLkV2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLkhzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7dmFyIEk9bmV3IEosbD0hMTtJLmthKCk7CkkuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnRyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbMTBdO3RoaXMuc209dGhpcy5hWzEwXTt0aGlzLlVzPXRoaXMuYVsxXTt0aGlzLmduPXRoaXMuYVsxMF07dGhpcy5CbT10aGlzLmFbOF07dGhpcy5zdz10aGlzLmFbN107dGhpcy5ldT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlFvPWI7Yi5wcm90b3R5cGU9e3RrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51azp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNtOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vczp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMucncoYSl9LHJ3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdzp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlFvfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9Cm51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnZpPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihhKXt0aGlzLm5iPWF9LGp1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLnlyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsdGhpcy5uYi53YSx0aGlzLm5iLmFmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMubmIuQmMpO2Vsc2UgaWYodGhpcy5ScSgpKXRoaXMuZnUoZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuUXUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7ClI9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuaXUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnFzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihjPXRoaXMucGxheWVyLkplKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsYyxmKTt0aGlzLnBsYXllci5MaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy51ZC5nZXRUaW1lKCksdGhpcy51ZD1hLDNFNTxiPyEwOiExO3RoaXMudWQ9YTtyZXR1cm4hMX0sRXU6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7CmUuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfSxEdTpmdW5jdGlvbihhKXtpZighdGhpcy55aCl7ZS5nZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMucHUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLAohMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LFZ0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIudnUodGhpcy5EdS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxGZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS5nZigibWlkcm9sbCIpO2lmKCF0aGlzLm5oKXt0aGlzLm5oPSEwO3ZhciBiPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksCnRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LFV0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIub3UodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5FdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLlV0KCk7dGhpcy5WdCgpfSxXdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5pdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQmQ9dGhpcy5BZC5sZW5ndGh9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9CiExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxmdTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRHQuYmluZCh0aGlzKSl9LER0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxxczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9dGhpcy5aZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy52aXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcz10aGlzLmFbMV07dGhpcy5VbT10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbNl07dGhpcy4kcz10aGlzLmFbM107dGhpcy5zbj10aGlzLmFbOF07CnRoaXMuZWs9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbM119Yy56bj1iO2IucHJvdG90eXBlPXtCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51aTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuJHM6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuem58fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkJzKDQpfSkuY2FsbChLdXRhZWNoZWRpZVBvWWFpLApLdXRhZWNoZWRpZVBvWWFpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.51.163
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.163.51.251.148.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame D24E
|
241 B
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame 5E5D
|
0
0
|
56ms
55ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V75qoCFgOO_YdP4KmPWQSO_YdP4KmPWQUAAAAGBvQHHLiZMCYLFm1CXCxHu8FqNNjtdpPZZjcbrqYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ9Q-_WTE__YiRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDQht7jyJqlOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugIWjEYrM4gJpvRbjI7AAAAgLv___9_PRBZziYj58bmXI4szo1r45mtJpbVyuUZWTY2i8vkPU-8-1khsm-fvhFhmf2-g4JyenrMLoOM5TIZ1AJZ0-TyG8QHDcNyMgjmN2GL0Woy2SyHs-ViMhiOhqPR_gRuNMAJGg4Hi91gsVsshpPFZDRYDhYoEIMJTshwtJmsRrvVbrIcTkaj2WayQYpWrWajzWC4mk1mu91qOBguRyOkaM1iNpksZqPlbjNYTkaD4WQ4RJhcDBe24XC01q1MvrVoMFm5lbvVYq1yrSYWi2s2nHiMa9HrYzotXMuRb7NFwQClvQgu0onmdPm7XJa35m1x65w-h0Us0Zws0onssq8sZ5ORc2NzLkcW58a18cxWE8tq5fKMLBubxWXyNxfDhW04HK11K5NvLRpMVm7lbrVYq1yricXimg0nHuNa9PqYTgvXcuTb7Bur3WK1Wo4Wi31jtVusVsvRYrHv0Bm-q8_ZqLxpFR6TV3Fujiwzp0HhMli8P4lpMe3ODp7f7-hUqS4aY0P2TSjMBo_BoIglgtNFOhG9jKeLWCJ5WqQTjWUwWc5cw8Vst5p5djPfyDNyeJwbw2Lk8C08holYojRdpBO97mVxGA6fv-DhPDzMftHTcPj8BQ_n4WF2i_0-p92t-bt1LqPp81bdTW7N3y32uzynt9JoeYv9PqfdLbj8LWaX22VR_7EhRqO5bjZXDJZzzWCVAAAAAAAAAACWMGfeBAAAAOA0kMViMFksFwBCjHWX4FMq5NEJ_K248WOIOV3-LpflrXlb3Dqnz2FlAImdAg!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H2
|
200
|
5182823249
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
43 B
249 B
|
8ms
7ms
|
XHR
application/json |
35.158.187.39
Amazon.com
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/30d06811711c3c6e10e3308ff89a9b651af909ec/
Frame 4158
|
109 B
671 B
|
18ms
4ms
|
XHR
application/json |
136.243.244.75
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/30d06811711c3c6e10e3308ff89a9b651af909ec/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEt1dGFlY2hlZGllUG9ZYWk9S3V0YWVjaGVkaWVQb1lhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5TbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5rdShtKTthLmp1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5zdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3I9dGhpcy5hWzddO3RoaXMub2o9dGhpcy5hWzNdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuSGo9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzddO3RoaXMuRGw9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzEwXTt0aGlzLkJwPXRoaXMuYVszXTt0aGlzLlJqPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMucHM9YjtiLnByb3RvdHlwZT17VnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53djp0aGlzLkdqKGEpfSwKR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkhqOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Objp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnA6dGhpcy5DbChhKX0sQ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRsOnRoaXMubnMoYSl9LG5zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5vczp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnA6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5wc3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuVnIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuU289CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk9jPVtdO3RoaXMub2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5DdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuU2c9e307dGhpcy5lZj0hMX1jLm1rPWI7Yi5wcm90b3R5cGU9e1B1OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWmI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5TZ1thXSYmKHRoaXMuU2dbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5QdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxhbzpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sQ3Q6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuQnQoYS5kYXRhKX0sQnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0saGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0scGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5IZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMua2goYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEhnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxabjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUubXEoYSkpcmV0dXJuOyhiPXRoaXMucGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxtcTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LElyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHllOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sR2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG9mOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxHZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LEVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwkaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwkcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxMbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx5bjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmNsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxDbzpmdW5jdGlvbigpe3JldHVybiBhLkppKCl8fGEuJGkoKXx8YS4kcSgpfHxhLkxsKCl8fGEueW4oKXx8YS5jbCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5DbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LCRiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LEdxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx5cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxIdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxDZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuZGkoYikrIjoiK3RoaXMuZGkoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxnZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHpnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5lZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LENjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy56ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkNjKEIpfSxFdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkdxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sSXU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlpiKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5lZShhKX0sZWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uS2MoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLktjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LE1kOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uS2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTWU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uYnAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSw1MDApfSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5IZShhKXx8dGhpcy5JcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmRmJiZ3aW5kb3cuc2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnhnKGEpKXJldHVybiB0aGlzLnhnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5abihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LGpzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmtoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGxoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5qcyhmLnNkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuT2M9YX0saXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEhvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5ta3x8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMubGs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi50dD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Hcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmJxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ZZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5RZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlZmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlpmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Sbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5UZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5jcT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmZkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuemM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlhmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Ubj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlhjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5hZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5jZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuU249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmtpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuSXM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi52ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5jdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuSHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmxrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp0PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbNV07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy5HdT10aGlzLmFbNF07dGhpcy5McD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLllsPWI7Yi5wcm90b3R5cGU9e3l0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56dDp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVzOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zazp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdvOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HdTp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTHA6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5ZbHx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMueXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5uaz1iO2IucHJvdG90eXBlPXtBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCsKbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxCcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxuZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubmQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5uZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPQphLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxrYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMubGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sdHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkJxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubmQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMubmt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmhsPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs3XTt0aGlzLnF3PXRoaXMuYVs5XTt0aGlzLkN1PXRoaXMuYVs0XTt0aGlzLkF1PXRoaXMuYVsxMF07dGhpcy5pdD10aGlzLmFbNl07dGhpcy5mdz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs2XX1jLnByPWI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5obDp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXI6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF3OnRoaXMuQnUoYSl9LEJ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5DdTp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQXU6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml0OnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLnByfHxrYSx3Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5nbCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PQp0eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MubGo9Yn0pKGMpO3ZhciBMPWMubGp8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnY9dGhpcy5hWzJdO3RoaXMudnM9dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMV19Yy4kcD1iO2IucHJvdG90eXBlPXtxdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnY6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ocjp0aGlzLlZtKGEpfSwKVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLldtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy4kcHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMucXYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5lbT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5sdShiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLAp0aGlzLkxjKSl9LGF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0senE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0uT3UoYil9LGZ4OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxEcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHh4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09Cm51bGx9fSl9KShjKTt2YXIgdD1jLmVtfHx0OyhmdW5jdGlvbihjKXtjLmdtPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSx2dTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxvdTpmdW5jdGlvbihiKXt0aGlzLlBlPQpifSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSwKRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSx6eDpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5TcSgpfHx0aGlzLlZuKCk7dGhpcy5EZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LFZuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJgpiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LGp4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSx1eDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYXg6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZ218fHA7KGZ1bmN0aW9uKGMpe2Mud2k9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy5Jbj0iMyI7dGhpcy5UYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdOwp0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5tdShhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHNyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldPwp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnNyKCk7aWYoIXRoaXMuQXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksCnRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sCnc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LHR1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Jbn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sUnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlRjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LG11OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx6cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LG1zOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy53aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUW49dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzZdO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMudms9YjtiLnByb3RvdHlwZT17UG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFuOnRoaXMuQ3AoYSl9LENwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EcDp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy52a3x8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuUG4oNCk7KGZ1bmN0aW9uKGMpe2MuVmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuVmp8fG9hOyhmdW5jdGlvbihjKXtjLldqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5TdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0KITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgcGE9Yy5Xanx8cGE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuWGp8fHFhOyhuZXcgcWEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UcD10aGlzLmFbOF07dGhpcy5UaT10aGlzLmFbMl07dGhpcy5Mbj10aGlzLmFbMl07dGhpcy5ubT10aGlzLmFbNF07dGhpcy55bz0KdGhpcy5hWzVdO3RoaXMuUXI9dGhpcy5hWzddO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuTm89dGhpcy5hWzVdO3RoaXMuTmw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5odj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHA6dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRpOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5tOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueW86dGhpcy5QcihhKX0sUHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFyOnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sdzp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5NbyhhKX0sCk1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmh2fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5TcCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3RoaXMud2coKTt0aGlzLnlnKCk7dGhpcy5wcD0hMX0sd2c6ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5jYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj0KYi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuY2M9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmCnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiYKYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sCnVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Pa3x8c2E7KGZ1bmN0aW9uKGMpe2MuTms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmCihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5WYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJgpiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS55ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuVmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5vaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLldjLmluZGV4T2YoYSkmJgp0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5XYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sbXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2Uub2YoYS52aWRlb1RhZyk/YS5jYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlZjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Oa3x8dGE7KGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy53cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkRyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCndxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Qa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLm9xPXRoaXMuYVszXTt0aGlzLm93PXRoaXMuYVszXTt0aGlzLmxwPXRoaXMuYVs3XTt0aGlzLnl2PXRoaXMuYVs4XTt0aGlzLkpwPXRoaXMuYVszXTt0aGlzLnRvPXRoaXMuYVsyXTt0aGlzLlltPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLiRrPWI7Yi5wcm90b3R5cGU9e0VsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GbDp0aGlzLm5xKGEpfSxucTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3E6dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm93OnRoaXMua3AoYSl9LAprcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHA6dGhpcy54dihhKX0seHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnl2OnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcDp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG86dGhpcy5YbShhKX0sWG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlltOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy4ka3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MubW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZmk9ITA7dGhpcy51Yz10aGlzLldnPSExO3RoaXMuRXMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnJoKCksdGhpcy5ZbygpLHRoaXMucmIoKSl9LEVzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LHZ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwKIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT8KYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwKIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5pZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sClliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxKZzpmdW5jdGlvbigpe2lmKCF0aGlzLkZjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LEJyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuenIoKTt3aW5kb3cuaW1hJiZiJiYKKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LHpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy4kYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuJGM9ITApO3JldHVybiB0aGlzLiRjfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWWIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5UdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsCiEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxUdDpmdW5jdGlvbigpe3RoaXMudWM9ITA7dmFyIGI9dGhpcy5KZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIiwKZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5vZyYmYi5hZHMmJih0aGlzLm9nPWIuYWRzKTtyZXR1cm4gdGhpcy5vZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpOwp0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5CcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlliKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlliKCksdGhpcy51Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOgoodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5abygpfS5iaW5kKHRoaXMpLAoxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxncDpmdW5jdGlvbigpe3RoaXMua3h8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSwKd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlF2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuJHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sJHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5sbnx8eWE7KGZ1bmN0aW9uKGMpe2Mubm49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTsKdmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbT10aGlzLmFbMV07dGhpcy5Qaj10aGlzLmFbMTBdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMuUnA9dGhpcy5hWzJdO3RoaXMuSHA9dGhpcy5hWzJdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMubm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5Daj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY206dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBqOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdjp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnA6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMueHcoYSl9LAp4dzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXc6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5Danx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuYm0oNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTsKcmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sdXQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueWQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCkFhOmZ1bmN0aW9uKCl7dGhpcy5WZSsrO2lmKDEwPHRoaXMuVmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBDYT1jLlJsfHxDYTsoZnVuY3Rpb24oYyl7Yy5RbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9CiEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7CnZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuZnE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLmZxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IudXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBEYT1jLlFsfHxEYTsoZnVuY3Rpb24oYyl7Yy5TbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYKKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlNsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG89dGhpcy5hWzddO3RoaXMuTGk9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzldO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuVXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Lcj1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5MaTp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucm86dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JaTp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLktyfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5Pbyg0KTsoZnVuY3Rpb24oYyl7Yy5Maz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5HZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmCihhPWEucGFyZW50Tm9kZSl9dGhpcy5BdD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQXQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7CnRoaXMubGQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5sZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZwOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmxkKTtlLkZlKHRoaXMubGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuTGt8fEhhOyhmdW5jdGlvbihjKXtjLktrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5HKCEwKX19KX0pKGMpO3ZhciBJYT1jLktrfHxJYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBiPQpsLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5Na3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5qPXRoaXMuYVs0XTt0aGlzLkpvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuVmw9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSm86dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5WbHx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuTWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLm9rPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG51OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sV246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5va3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsCmQsZil7dGhpcy4kYT1hO3RoaXMuQmc9dGhpcy5vaT0hMTt0aGlzLnNoPWQ7dGhpcy5TaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeihhKSk7dmFyIGM9dGhpcy5nYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5JZSh0aGlzLiRhLnVybCkmJm0uT2Qpe3ZhciBlPW5ldyB6KGEudXJsKTtlLm51KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMucGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQmcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuZ2IudXJsQ2FsbGVkPXRoaXMuJGEudXJsO3RyeXt0aGlzLlNoP3RoaXMuZ2Iub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLm9pfHwodGhpcy5nYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJgp0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmdiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5JZSh0aGlzLiRhLnVybCk/bS5PZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkllKHRoaXMuJGEudXJsKSx0aGlzLnNoJiZ0aGlzLnNoKCl9cmV0dXJuIHRoaXMuZ2J9fX0pKGMpO3ZhciBNYT1jLnBrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5XZD0hMX1jLm1qPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3RoaXMuV2Q9YX0scXU6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtCdzoiQWRDbGlja1RocnUiLER3OiJBZEVycm9yIixFdzoiQWRTdG9wcGVkIixIdzoiQWRMaW5lYXJDaGFuZ2UiLEl3OiJBZFRhZ1BhcnNlZCIsTHc6IkFkVmlkZW9Db21wbGV0ZSIsT3c6IkFkTG9hZGVkIixQdzoiQWRTa2lwcGVkIixRdzoiQWRTdGFydGVkIixGdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEd3OiJBZEltcHJlc3Npb24iLEN3OiJBZENyZWF0aXZlVmlldyIsSnc6IkFkVmlkZW9NaWRwb2ludCIsS3c6IkFkUGF1c2VkIixNdzoiQWRWaWRlb1N0YXJ0IixOdzoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmEodGhpcy5XZCxiW2RdKX0sWHQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlZkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlZkKXRoaXMuSGEuVmQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlZkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldkJiZ0aGlzLll0KCk7dGhpcy5IYSYmdGhpcy5YdCgpfX19KShjKTt2YXIgTmE9Yy5tanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPQohMTt0aGlzLnhjPSIiO3RoaXMuamU9dGhpcy53Yz10aGlzLndiPW51bGw7dGhpcy56cD10aGlzLkpiPXRoaXMuamg9ITE7dGhpcy5MYT0iIjt0aGlzLmVoPSExO3RoaXMud2E9dGhpcy5xZD0iIjt0aGlzLiRnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLmFmPSExO3RoaXMucGE9W107dGhpcy5QZz10aGlzLmdjPSIiO3RoaXMucmU9ITE7dGhpcy5zZj0wO3RoaXMuSGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMub2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmljPSIiO3RoaXMuamM9W107dGhpcy5rYz1bXTt0aGlzLktkPVtdO3RoaXMuaGM9IiI7dGhpcy50Zj0KMDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5FYz0hMTt0aGlzLmhwPXRoaXMuUWQ9bnVsbDt0aGlzLk5oPXRoaXMubWM9dGhpcy50Zz10aGlzLndmPXRoaXMuT2Q9dGhpcy5sZT10aGlzLlVjPSExO3RoaXMuaWI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucmQ9MDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuYmQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5QZj0iIn1jLnFrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMueGMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy53YyxhZHRhZ3JlZ2V4OnRoaXMuamUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuamgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuenAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCwKY2xpZW50Q29uZmlnOnRoaXMud2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLiRnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmdjLGhvbWFkQWRwYXRoOnRoaXMuUGcsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5yZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5zZixIT01BRF9WRVJJRklFRDp0aGlzLkhmLEhPTUFEX0JMT0NLRUQ6dGhpcy5GZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5vYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuR2YsdGVzdEhpZGU6dGhpcy5pYyx0ZXN0VGFnczp0aGlzLmpjLHRlc3RUYWdzSlM6dGhpcy5rYyx0ZXN0VGFnc1hIUjp0aGlzLktkLHRlc3RDb29raWU6dGhpcy5oYyx0aHJvdHRsZTp0aGlzLnRmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlVjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMubGUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuT2QsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMud2YsY29uZmlnRmFpbHVyZXM6dGhpcy5pYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5LaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMua2IsdnBhaWQ6dGhpcy5tYyxza2lwQWxsb3dlZDp0aGlzLk5oLHZtYXBzOnRoaXMubGksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLmJkLGFkRmFsbGJhY2tVUkw6dGhpcy5QZn19LFFxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmliKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaWJbYl0mJjE9PXRoaXMuaWJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5IbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkhlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkdjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5LYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnhjfHx0aGlzLndifHx0aGlzLndjfHx0aGlzLmplKSYmKGc9dGhpcy54cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnlxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5HYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sR2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuSGUoYSk7cmV0dXJuIGJ9LHlxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5YdztyZXR1cm4ibm9uZSJ9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5LaF19LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZCgpLGI9dGhpcy5NaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxwaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx3czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5waChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMucGgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx4czpmdW5jdGlvbihhKXt0aGlzLnhjJiYoYSs9dGhpcy54Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMud2MmJihhPXRoaXMud3MoYSx0aGlzLndjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi5ydShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIucXUoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZWg9ITA7dGhpcy5xZD1hO3RoaXMud2E9Yjt0aGlzLmFmPWQ7dGhpcy5RZD1mO3RoaXMuQmM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmhzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuZnMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueWMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLnFkK3RoaXMuZ2UoImdsb2JhbCIpKSx0aGlzLk1xLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LGZzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZ2UoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy55Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGdlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmxlKXt0aGlzLmxlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkJjPSExKTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuJGc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkZmKSk7dGhpcy5OYigpO2UuQ2Moay50dCk7KGI9ZS4kYih0aGlzLnNkKCkpKXx8KGI9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sTXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmdjfHx0aGlzLkxhfHx0aGlzLnljKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHljOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuR2MoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmdjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuUGc9YS5hZHBhdGh8fCIiO3RoaXMucmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5LaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkhjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxIYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLktjKCkpLGQ9dGhpcy56YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMuZ2UoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlJ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjdXN0b21lciIpO2E/dGhpcy55bT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLnltPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5IYyghMCl9LmJpbmQodGhpcyksITApfX0sUnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5FYz0hMDt0aGlzLkhjKCEwKTtyZXR1cm59fXRoaXMuT2Q9dGhpcy5NYihiLnN0cmljdCk7dGhpcy53Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5rYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5LZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy53Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuamU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuamg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubWM7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmNkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5saT1iLnZtYXBzfHwiIjt0aGlzLmJkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5QZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkZxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5yZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy50Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5FYz0hMCx0aGlzLkhjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLktkKT90aGlzLmFmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMubmUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmtkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFBjOmZ1bmN0aW9uKGEpe3RoaXMuVWM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKGEpKSx0aGlzLk5iKCksdGhpcy5uZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmljKXt2YXIgYT1lLmtkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5paCgpKXRoaXMuUGModGhpcy5vYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuV2goKX19ZWxzZSB0aGlzLldoKCl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5wZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuS2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBmKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxXaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVmguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVmgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxwZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMuc2YrKyx0aGlzLkRhKG5ldyB6KHRoaXMuaGMpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMucWYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5UaCgpfSxxZjpmdW5jdGlvbihhKXt0aGlzLlBjKHRoaXMuR2YsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5zZj90aGlzLnBmKCk6dGhpcy5xZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlRoKCk6dGhpcy5xZigiQUFBIil9LFRoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubmUoKX0saWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlVjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmloKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5IZikpO3RoaXMuUWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5RZCYmdGhpcy5RZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMud2YmJnRoaXMuUXEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sJGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEub2k9ITApO3EmJmUuRXIoKSYmKGEuQmc9ITApO2cmJihhLlNoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmJiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5HYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sVXU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmxpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLkl2LmJpbmQodGhpcyksdGhpcy5Idi5iaW5kKHRoaXMpKX0sSXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LEh2OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkNjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG5lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmJiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sa3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sRnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5xa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLmpsPXRoaXMuYVs4XTt0aGlzLk9yPXRoaXMuYVs3XTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLk5wPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuYXE9YjtiLnByb3RvdHlwZT17d2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9yOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXI6dGhpcy5NcChhKX0sTXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5wOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7CnZhciBQYT1jLmFxfHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy53ayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWWcmJmEuZi5ZZyh7cGF1c2U6dGhpcy55ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMudXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLldiPXRoaXMuYWQ9ITE7dGhpcy5Cbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlJvPWUuYWEoMTApOwp0aGlzLm1mPTA7dGhpcy5aYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlpjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLlpjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudGg9dGhpcy5HZD0hMTt0aGlzLm1oPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYmM9ITE7dGhpcy5ycD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SZD0KdGhpcy5PYj10aGlzLnBlPXRoaXMuZ2Q9dGhpcy5JZD10aGlzLnNiPXRoaXMubmM9dGhpcy52aD10aGlzLm1kPXRoaXMubHY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMuc2M9W107dGhpcy5kYz17fTt0aGlzLmp0PTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy54ZD17fX1jLmtrPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5LdSgpO2UudihrLlRuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9CmM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuY3AoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubWgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLkxlKGEsYixjKX0sNTApfX0sV2U6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5tZD0hMTt0aGlzLmM9YTt0aGlzLnd1KHRoaXMuYyk7dGhpcy54ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTWcoYSk7dGhpcy5zYz10aGlzLkRnKGEpO3RoaXMubXAoKX0sTWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSGQ9dGhpcy5JcShhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkRnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuc3EoYSkpKTtyZXR1cm4gY30sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LElxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuamQmJmEuamQuZXJyb3ImJmEuamQuZXJyb3IuY29kZSYmCihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUcuWGQuY29kZT9lLnYoay5kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLk1lKCksYj09Ry5LZi5jb2RlJiZlLnYoay5Gcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5icSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTHUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5JZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTGYuY29kZTplLnYoay5ndyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLmh3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuR3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWGIoYSk7dGhpcy5SYSgpfSxYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9CmEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy4kZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLnd4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuYm8mJnRoaXMucGxheWVyLnZlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci52ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuWG4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLiRlJiZiLmxvYWQoKTtpZih0aGlzLlhoKGIpKXt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLiRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuJGU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm5wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy51dSgpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSx1dTpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiYKdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5hbyh0aGlzLmMub3JpZ2luLnZhKTt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLndoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuTHEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsCmRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmCiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5hYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5zYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVHYoKSx0aGlzLmIuYWMoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuWHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLmF3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT0KYS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlZiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuTC5iZHx8dGhpcy5RYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmCnRoaXMuVXYoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmZjKCkpLHRoaXMuVnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuaGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LFZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuWGMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uYz0hMX0sWHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxXdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxUdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7ZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5tZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7CmUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LCR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTsKZS5vZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sU3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmN3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5taSghMCl9LFhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIiwKYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpOwphLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2J8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5CbykpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5hZCYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLmFkPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5DZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLAp0aGlzLlphKCksITApLHRoaXMuTC50Z3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuTXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuTHYoKTt0aGlzLmhpKCk7dGhpcy5lZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmdkfHx0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZ2R8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLlJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxVbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSXUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmCnRoaXMuYy5TZCYmdGhpcy5Vbih0aGlzLmMuU2QpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5SZHx8KGUudihrLklzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucWMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLldiPXRoaXMuYWQ9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5JZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOgp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxQdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLldiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5hcCgpO3RoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5sdil0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5JZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT0KTWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnB2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi0KYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLldiPXRoaXMuYWQ9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5aYy5yZXBsYWNlKCJbdGltZV0iLAplLkNnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy52aHx8KHRoaXMudmg9ITAsdGhpcy5tZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHB2OmZ1bmN0aW9uKGEpe2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksCnRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5tZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmNpPWEpfSxQaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sS3U6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxMdTpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSwKWGE6ZnVuY3Rpb24oYSl7ZS5NZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5DZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMueGQmJnRoaXMueGQudHJhY2smJnRoaXMueGQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSnEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYKKHRoaXMua2U9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5IZC5pbXByZXNzaW9ucyYmZS5DcihnLnVybCx0aGlzLkhkLmltcHJlc3Npb25zKT90aGlzLktlKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Tbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnhwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09CnR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuV24oYyksZnx8KGY9dGhpcy5zZyksZXx8KGU9dGhpcy5zZyksdGhpcy5ZbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx4cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09CmJ9KX0sTXY6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLk52LmJpbmQodGhpcykpfSxOdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVmImJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sCkx2OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTsKdmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmNkJiYoYj10aGlzLkwuY2QpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmMuaWQ9dGhpcy5ycDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpOwp2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm52LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubXYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjsKYy5hcHBlbmRDaGlsZChmKTt0aGlzLmMubGYmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsCmIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlFlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5uYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSx5ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sbXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LG52OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuZ2R8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5rZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnRofHwhdGhpcy5MLlVjJiYic3BpZWdlbC5kZSIhPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5nZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm5nKCkpOih0aGlzLnRoPXRoaXMuUWM9dGhpcy5EZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmtlPSEwLGE9ZS5kZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5MZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbmc6ZnVuY3Rpb24oYSl7dGhpcy5OdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoITApfS5iaW5kKHRoaXMpLHRoaXMuanQpOih0aGlzLklkPSEwLHRoaXMuYi5CZSgpLHRoaXMuYi5idSgpLHRoaXMuYmM9ITEsCmUudihrLnFwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy54ZSgpLkdoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5WYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnNjJiYwPHRoaXMuc2MubGVuZ3RoJiYoYS5hZElkcz10aGlzLnNjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5SbysiLSIrdGhpcy5tZjt0aGlzLmMmJnRoaXMuYy5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ra3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLm50PXRoaXMuYVsyXTt0aGlzLnV3PXRoaXMuYVs0XTt0aGlzLmNuPXRoaXMuYVs5XTt0aGlzLnVwPXRoaXMuYVs3XTt0aGlzLmtqPXRoaXMuYVsyXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLlVrPXRoaXMuYVs0XTt0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfQpjLnN2PWI7Yi5wcm90b3R5cGU9eyRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hczp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm50OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51dzp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY246dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnVwOnRoaXMuamooYSl9LGpqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Vazp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5zdnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuJHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnJjPXRoaXMudGM9ITE7dGhpcy52YT0iIjt0aGlzLkJmPSExO3RoaXMuVGc9IiI7ZCYmZC5lbXB0eT90aGlzLmxzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2Mua249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUua2QoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnBnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkpkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5rcy5iaW5kKHRoaXMpLAp0aGlzLmdzLmJpbmQodGhpcykpfSxFZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5IcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxIcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGtzOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpOwp0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlRnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sbHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPXRoaXMuRWcoKTt0aGlzLnRjPXRoaXMucmYoKTt0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LGdzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSWYse2RlcHRoOmF9KSl9LEpjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuSnIoKT90aGlzLmZ2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTmcoKSxoLHtBZFN5c3RlbTp0aGlzLnJxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5MZikpOihhPTAsdGhpcy5EdigpJiZ0aGlzLldlKHRoaXMuc3AoKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMudGM/KHRoaXMudGM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQuUmUoKX0scWg6ZnVuY3Rpb24oKXt0aGlzLnJjPyh0aGlzLnJjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LnFoKCl9LER2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3YoKT90aGlzLmJ2KCk/ITA6KC0xIT10aGlzLkRjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVGQpKTp0aGlzLnNhKHRoaXMuU2Eody5FZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuU2MsRy5LZikpLCExKX0sV2U6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuU2R8fChhLlNkPVtdKTthLlNkLnB1c2godGhpcy5UZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk5lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnRjO2EucWM9YS5xYz9hLnFjOnRoaXMucmM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMucGFyZW50LldlKGEpfSxzcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkRjKCk7YS5PPXRoaXMuS2coKTthLlZiPXRoaXMudHEoKTthLkt2PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMucXEoKTthLmxmPXRoaXMuSHEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMudXEoKSk6Yi5QYS5jb25jYXQodGhpcy5DcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LlhiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuWGImJnRoaXMucGFyZW50LlhiKGIpLGE9MCx0aGlzLkpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sWGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuWGIoYSl9LHVnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGZ2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sY3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxidjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuRGMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVWg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnJmKCkmJihhPSEwKTtyZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEpyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuYWgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSx1cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sS2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksWXc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucGQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxEYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5IdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5rbnx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5acT10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLkh0PWI7Yi5wcm90b3R5cGU9e1lxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWnE6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuSHR8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLllxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuVmI9IiI7dGhpcy5CPXRoaXMucWM9dGhpcy50Yj0hMTt0aGlzLkNlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5EZT0iIn1jLmRtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LEFxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLApiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLkFxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5EZT1hfSxMcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuZG18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVs0XTt0aGlzLnFsPXRoaXMuYVs5XTt0aGlzLkVpPXRoaXMuYVsxMF07dGhpcy5icj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlNrPQpiO2IucHJvdG90eXBlPXtwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Ta3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMucHQoNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsCk9hOiJEVVJBVElPTl9FUlJPUiJ9LFNjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LExmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx6dzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LEF3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmRyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuaXI9YjtiLnByb3RvdHlwZT17Y3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5pcnx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuY3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5lcnJvcj1hO3RoaXMuamQ9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Taj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuU2p8fFVhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJqPXRoaXMuYVszXTt0aGlzLlNyPXRoaXMuYVs1XTt0aGlzLldrPXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNF07dGhpcy52cj10aGlzLmFbNV07dGhpcy5jcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5abD1iO2IucHJvdG90eXBlPXtBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5ScihhKX0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNyOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xazp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy51cihhKX0sCnVyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52cjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLlpsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Baig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5Pdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLm9sPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLnN4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlJ0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxvdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy52cShhKSl9fSx2cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntCeDohMCxBeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntveDoidmlkZW8iLER4OiJqc0N1c3RvbSIsRXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRng6MSxadzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEtxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5vdDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLktxKGIpLHZlbmRvcjpifSk7CnRoaXMuSnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk92Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxWbzpiLHl4OiExfSl9LEp1OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Gcnx8KGEucngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5vbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzVdO3RoaXMuam09dGhpcy5hWzJdO3RoaXMuWG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzEwXX1jLnBqPWI7Yi5wcm90b3R5cGU9e0VrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gazp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5wanx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuRWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXtwcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnBxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5WcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUXU6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZmQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFZxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxpcTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnFqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLlVvPXRoaXMuYVs2XTt0aGlzLkNpPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuY3U9YjtiLnByb3RvdHlwZT17ZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5lbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW86dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuJGwoYSl9LCRsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuY3V8fGJiLExjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmRuKDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSwKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSwKRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuSmx8fGNiOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPQohMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLmdxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5iYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmRkKCk7dGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sCmtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxMZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxnZzpmdW5jdGlvbigpe2lmKHRoaXMuZGQoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTsKdGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuV3d9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSwkdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5teCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuRGMoKTotMX0sRHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sZ3E6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksCjEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5EcShiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLklsfHxkYjsoZnVuY3Rpb24oYyl7Yy5LbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEdyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmhtLkpuLkhuP3dpbmRvdy5PTy5obS5Kbi5Ibi5VdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPQpkYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLktsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzhdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLlR1PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLmd1PWI7Yi5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QbDp0aGlzLmtxKGEpfSwKa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxxOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5UdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuZ3V8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLk9sKDQpOyhmdW5jdGlvbihjKXtjLllpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2coKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSwKemg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLllpfHxoYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5oZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLlhpfHxpYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5EZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksCnRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuaHF8fCh0aGlzLmhxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuQ2god2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLlppfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdD0KdGhpcy5hWzEwXTt0aGlzLlpwPXRoaXMuYVsxMF07dGhpcy5aaj10aGlzLmFbNF07dGhpcy5Tcz10aGlzLmFbMl07dGhpcy5ndD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLkRqPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnA6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpqOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tczp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkRqfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TmMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSwKTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLkxtfHxVOyhmdW5jdGlvbihjKXtjLkttPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTnMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlBxKCl9LE5zOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLkttfHxWOyhmdW5jdGlvbihjKXtjLk1tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPQpbXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy53ZCYmKGI9ZS55cChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksCnRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFljOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LGd2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5hdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSwKUHE6ZnVuY3Rpb24oKXtpZih0aGlzLkljKWZvcih2YXIgYj0wO2I8dGhpcy5JYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkljW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5ndihiKX19KX0pKGMpO3ZhciBsYj1jLk1tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Ncz10aGlzLmFbNV07dGhpcy5Vaj10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbMl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy54cj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5IbD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5xcj1iO2IucHJvdG90eXBlPXtMczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXM6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVqOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sazp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpvOnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHI6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnFuOnRoaXMua28oYSl9LGtvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sbzp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnFyfHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5Mcyg0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHwKb2I7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5XaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVsPXRoaXMuYVs5XTt0aGlzLkFvPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsyXTt0aGlzLld1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLk5pPXRoaXMuYVszXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuTm09YjtiLnByb3RvdHlwZT17dGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnVsOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbzp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc3Q6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLld1OnRoaXMua3QoYSl9LAprdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubHQ6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5OaTp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSms6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuTm18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnRsKDQpOyhmdW5jdGlvbihjKXtjLndsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVyhiKTt0aGlzLlooYSk7dGhpcy5RdCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLm11dGUmJnRoaXMuamEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxZZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLndsfHxzYjsoZnVuY3Rpb24oYyl7Yy52bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmCiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm9hKCkpO2EuS2EoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIHRiPWMudmx8fHRiOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMueGx8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy53aj10aGlzLmFbMV07dGhpcy5qaz10aGlzLmFbMl07dGhpcy5zbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLlNtPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2o6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmprOnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU218fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmdqKDQpOwooZnVuY3Rpb24oYyl7Yy53bj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LApOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLndufHx3YjsoZnVuY3Rpb24oYyl7Yy52bj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sT3Q6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj0KW10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudWM9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5PdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpOwpyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnZufHx4YjsoZnVuY3Rpb24oYyl7Yy54bj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7CnRoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLnhufHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG09dGhpcy5hWzZdO3RoaXMuS3M9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy54aj1iO2IucHJvdG90eXBlPXtDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lczp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy54anx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkNtKDQpOyhmdW5jdGlvbihjKXtjLndtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy52dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LE11OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMud218fEJiOyhmdW5jdGlvbihjKXtjLnZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ycz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5ycz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMudm18fENiOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMueG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbMl07dGhpcy51bT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmlqPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbzp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmlqfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuRG8oNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5wbXx8R2I7KGZ1bmN0aW9uKGMpe2Mub209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLm9kKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5acigpOnRoaXMuamcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuU2YoKXx8dGhpcy5tKCEwKX0sWnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5UdyYmYi5WdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMub2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0sb2Q6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LApueDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5vZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLm9tfHxIYjsoZnVuY3Rpb24oYyl7Yy5xbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMucW18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMTBdO3RoaXMueHQ9dGhpcy5hWzNdO3RoaXMuc2o9dGhpcy5hWzldO3RoaXMud3A9dGhpcy5hWzldO3RoaXMuQmw9dGhpcy5hWzddO3RoaXMuRm09dGhpcy5hWzZdO3RoaXMuUHA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy53bz1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnh0OnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLndwOnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbDp0aGlzLkVtKGEpfSxFbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRm06dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy53b3x8S2IsVGM9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuV3AoNCk7KGZ1bmN0aW9uKGMpe2MubGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sbHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sS2E6ZnVuY3Rpb24oKXt2YXIgYjtIPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPWMubGx8fFg7KGZ1bmN0aW9uKGMpe2Mua2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5ZZSYmYiE9dGhpcy5ZZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLmZhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS50eCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMua2x8fFk7KGZ1bmN0aW9uKGMpe2MubWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0g9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihIKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMubWx8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpsPXRoaXMuYVs1XTt0aGlzLm9yPXRoaXMuYVsxXTt0aGlzLkxqPXRoaXMuYVsxMF07dGhpcy5lbz10aGlzLmFbOV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5qdj10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbM107dGhpcy5Hbj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs0XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3lsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3I6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Majp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZW86dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFpOnRoaXMuaXYoYSl9LGl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuanY6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnJyfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy5naz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApodTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0scXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5na3x8T2I7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5ma3x8UGI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTsKaWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5oa3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLmF0PWI7Yi5wcm90b3R5cGU9e1ZzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Xczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMuYXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5Wcyg0KTsoZnVuY3Rpb24oYyl7Yy5Cbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxOZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sClB0OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlJjJiYodGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJjPSExKSx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksCiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuQm58fFRiOyhmdW5jdGlvbihjKXtjLkFuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksCmImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE9mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pOwp0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLlN0KCl9LFN0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYil7dGhpcy5VYihiKX0pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuTnQ9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5Bbnx8VWI7CihmdW5jdGlvbihjKXtjLkNuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuUHQoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLkNufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJrPXRoaXMuYVsxMF07dGhpcy55aT10aGlzLmFbNF07dGhpcy5SbT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLiRqPWI7Yi5wcm90b3R5cGU9e0FrOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuQms6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuJGp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkFrKDQpOyhmdW5jdGlvbihjKXtjLiRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuRHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGh1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Ec30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYodGhpcy54aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuJG18fE87KGZ1bmN0aW9uKGMpe2MuWm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy50dSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuWm18fFA7KGZ1bmN0aW9uKGMpe2MuYW49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYW58fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5PcT10aGlzLmFbMl07dGhpcy5SaT10aGlzLmFbM107dGhpcy5mbD10aGlzLmFbMV07dGhpcy5rcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLm5sPWI7Yi5wcm90b3R5cGU9e05xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmk6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ubHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuTnEoNCk7KGZ1bmN0aW9uKGMpe2MuWWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Za3x8WjsoZnVuY3Rpb24oYyl7Yy5Yaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLlhrfHxhYTsoZnVuY3Rpb24oYyl7Yy5aaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLlprfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGo9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtjajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLk9zfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5jaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5ia3x8ZGM7KGZ1bmN0aW9uKGMpe2MuYWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5ha3x8ZWM7KGZ1bmN0aW9uKGMpe2MuY2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLmNrfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmw9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuWHE9CnRoaXMuYVsxXTt0aGlzLllzPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs0XTt0aGlzLnRzPXRoaXMuYVsxXTt0aGlzLkVuPXRoaXMuYVsxMF07dGhpcy5HdD10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbNV07dGhpcy56cz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLnR2PWI7Yi5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemo6dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhxOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zczp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSGs6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRzOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Fbjp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLkd0OnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5KbTp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnR2fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hbCg0KTsoZnVuY3Rpb24oYyl7Yy5yaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubWUoKTt0aGlzLmZnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LApFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwOwppZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfSxtZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJgpiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD8KdGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzddO3RoaXMuQ3Y9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMuRmo9dGhpcy5hWzEwXTt0aGlzLnd3PXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVs5XTt0aGlzLnVuPXRoaXMuYVs0XTt0aGlzLkhtPXRoaXMuYVszXTt0aGlzLlBpPXRoaXMuYVs0XTt0aGlzLmxtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQXM9YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJqOnRoaXMuQnYoYSl9LEJ2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnl1Ogp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy52dyhhKX0sdnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnd3OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW46dGhpcy5HbShhKX0sR206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IbTp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5Bc3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuYWooNCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuZm09YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5FcShhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLAp0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMuemQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0sT3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMuemQubGVuZ3RoO2ErKyl0aGlzLnpkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5mbXx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs5XTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLlVsPXRoaXMuYVs2XTt0aGlzLllyPXRoaXMuYVs3XTt0aGlzLlVxPXRoaXMuYVs2XTt0aGlzLkx0PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs0XTt0aGlzLkdpPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLmpxPWI7Yi5wcm90b3R5cGU9e3lrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56azp0aGlzLnVvKGEpfSx1bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudm86dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVsOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zcjp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5MdDp0aGlzLldsKGEpfSxXbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhsOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuanF8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLnlrKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoKIiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLkV2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLkhzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7dmFyIEk9bmV3IEosbD0hMTtJLmthKCk7CkkuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnRyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbMTBdO3RoaXMuc209dGhpcy5hWzEwXTt0aGlzLlVzPXRoaXMuYVsxXTt0aGlzLmduPXRoaXMuYVsxMF07dGhpcy5CbT10aGlzLmFbOF07dGhpcy5zdz10aGlzLmFbN107dGhpcy5ldT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlFvPWI7Yi5wcm90b3R5cGU9e3RrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51azp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNtOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vczp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMucncoYSl9LHJ3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdzp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlFvfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9Cm51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnZpPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihhKXt0aGlzLm5iPWF9LGp1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLnlyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsdGhpcy5uYi53YSx0aGlzLm5iLmFmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMubmIuQmMpO2Vsc2UgaWYodGhpcy5ScSgpKXRoaXMuZnUoZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuUXUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7ClI9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuaXUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnFzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihjPXRoaXMucGxheWVyLkplKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsYyxmKTt0aGlzLnBsYXllci5MaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy51ZC5nZXRUaW1lKCksdGhpcy51ZD1hLDNFNTxiPyEwOiExO3RoaXMudWQ9YTtyZXR1cm4hMX0sRXU6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7CmUuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfSxEdTpmdW5jdGlvbihhKXtpZighdGhpcy55aCl7ZS5nZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMucHUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLAohMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LFZ0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIudnUodGhpcy5EdS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxGZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS5nZigibWlkcm9sbCIpO2lmKCF0aGlzLm5oKXt0aGlzLm5oPSEwO3ZhciBiPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksCnRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LFV0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIub3UodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5FdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLlV0KCk7dGhpcy5WdCgpfSxXdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5pdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQmQ9dGhpcy5BZC5sZW5ndGh9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9CiExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxmdTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRHQuYmluZCh0aGlzKSl9LER0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxxczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9dGhpcy5aZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy52aXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcz10aGlzLmFbMV07dGhpcy5VbT10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbNl07dGhpcy4kcz10aGlzLmFbM107dGhpcy5zbj10aGlzLmFbOF07CnRoaXMuZWs9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbM119Yy56bj1iO2IucHJvdG90eXBlPXtCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51aTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuJHM6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuem58fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkJzKDQpfSkuY2FsbChLdXRhZWNoZWRpZVBvWWFpLApLdXRhZWNoZWRpZVBvWWFpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.244.75
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.75.244.243.136.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/2555669a9a9aede86f7c9d01e4e7eab7007d5afb/
Frame 4158
|
42 B
875 B
|
159ms
147ms
|
XHR
image/gif |
136.243.244.75
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/2555669a9a9aede86f7c9d01e4e7eab7007d5afb/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIEt1dGFlY2hlZGllUG9ZYWk9S3V0YWVjaGVkaWVQb1lhaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVWV8fCh4LlVlPTApO3guVWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5VZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5iYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5TbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay56YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuaGYoYyk7YS5rdShtKTthLmp1KGwpO2EuV3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5zdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5saC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUubGgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3I9dGhpcy5hWzddO3RoaXMub2o9dGhpcy5hWzNdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuSGo9dGhpcy5hWzldO3RoaXMuTm49dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzddO3RoaXMuRGw9dGhpcy5hWzhdO3RoaXMub3M9dGhpcy5hWzEwXTt0aGlzLkJwPXRoaXMuYVszXTt0aGlzLlJqPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMucHM9YjtiLnByb3RvdHlwZT17VnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53djp0aGlzLkdqKGEpfSwKR2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkhqOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Objp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnA6dGhpcy5DbChhKX0sQ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRsOnRoaXMubnMoYSl9LG5zOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5vczp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQnA6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5wc3x8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuVnIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuU289CiExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk9jPVtdO3RoaXMub2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5DdC5iaW5kKHRoaXMpKTt0aGlzLm9iPXt9O3RoaXMuU2c9e307dGhpcy5lZj0hMX1jLm1rPWI7Yi5wcm90b3R5cGU9e1B1OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLm9iKXRoaXMub2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMub2JbYl0rIl8iKTtyZXR1cm4gYX0sWmI6ZnVuY3Rpb24oKXt0aGlzLmVmfHwodGhpcy5lZj1lLmFhKDEwKSk7cmV0dXJuIHRoaXMuZWZ9LHBiOmZ1bmN0aW9uKGEpe3RoaXMub2JbYV18fCh0aGlzLm9iW2FdPTApO3RoaXMub2JbYV0rPTE7NTx0aGlzLm9iW2FdJiYhdGhpcy5TZ1thXSYmKHRoaXMuU2dbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5QdSgpLCEwKSl9LG9lOmZ1bmN0aW9uKCl7dGhpcy5iYT17dXJsczp7fSwKaG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxhbzpmdW5jdGlvbihhKXt0aGlzLmJhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sQ3Q6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuQnQoYS5kYXRhKX0sQnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj0KdGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXImJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0saGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmJhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0scGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5IZyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMua2goYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEhnOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxabjpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLnphKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUubXEoYSkpcmV0dXJuOyhiPXRoaXMucGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmJhLnVybHNbYV09Yjt0aGlzLmJhLnVybHNbYl09YTt0aGlzLmJhLmhvbWFkVXJsc1thXT1iO3RoaXMuYmEub3JpZ2luYWxVcmxzW2JdPWF9fSxtcTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pOwpyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5vcmlnaW5hbFVybHMmJnRoaXMuYmEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmJhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LElyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHllOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sR2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG9mOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT0KYS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxiaDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTsKcT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxHZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTsKaWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZShhKX0uYmluZCh0aGlzKSwxMDApfSxIYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxNaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxsPTMyODUzNzc1MjAsbix5LHUscix0O2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tCjEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3k9azt1PW07cj1sO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocSw1KSsobl4KeV51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChxLDUpKyhuJnl8biZ1fHkmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTYwOzc5Pj1mO2YrKyl0PWQocSw1KSsobl55XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTttPW0rdSY0Mjk0OTY3Mjk1O2w9bCtyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobSkrYihsKSkudG9Mb3dlckNhc2UoKX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKykscT1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PgoyLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LEVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT17fSwKYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShtfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHQpe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1tO2EuaXNCbGluaz1sO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwkaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSwkcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxMbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx5bjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sCmNsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sem06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxDbzpmdW5jdGlvbigpe3JldHVybiBhLkppKCl8fGEuJGkoKXx8YS4kcSgpfHxhLkxsKCl8fGEueW4oKXx8YS5jbCgpfHxhLnptKCl9fTtyZXR1cm4gbnVsbCE9YS5DbygpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LCRiOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGZhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LEdxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx5cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxIdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxDZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuZGkoYikrIjoiK3RoaXMuZGkoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxnZjpmdW5jdGlvbihhKXt0aGlzLkNiPWF9LHpnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuQ2I7dGhpcy5lZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LENjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy56ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkNjKEIpfSxFdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkdxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sSXU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlpiKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5lZShhKX0sZWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FdChhKTtpZihiKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPW0uS2MoKTttLnlhKGEsITApO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjttLkRhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLktjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTsKbS55YShmLCEwKTtmPW0ueWEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiI7bS5EYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LE1kOmZ1bmN0aW9uKGEpe2lmKCFtfHwhbS5WKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYixmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYj1hLmpvaW4oIiwiKTthPW0uS2MoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2E9bS55YShhLCEwKTthLmRhdGEuaG9tYWRfdHJhY2s9YjttLkRhKGEpfX0sTWU6ZnVuY3Rpb24oKXttJiZtLlY/bS5pc0VuYWJsZWQmJm0uYnAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSw1MDApfSx3ZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpOwpiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi5IZShhKXx8dGhpcy5JcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmRmJiZ3aW5kb3cuc2FuZGJveC5kZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmRmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnhnKGEpKXJldHVybiB0aGlzLnhnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGEsYi5MYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5abihlLGEpO3JldHVybiBlfSxiYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBsPWV8fG07ZT0hMDtrJiYoZT0hMSk7aWYobCYmbC5WKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKHVjKXtjKHVjKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC55YShhLGUpO2U9bC55YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIGwuRGEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJiKGEsYixkLGYsYyxsLGcsayl9LmJpbmQodGhpcyksNTAwKX0sa2g6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHwKNCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LGpzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmtoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLk9jKWZvcih2YXIgYyBpbiB0aGlzLk9jKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuT2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJgooYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGxoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYmIoYSxmLkxhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5qcyhmLnNkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSwKc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuT2M9YX0saXc6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLmJiKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KToKYyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEhvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxDcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX19fSkoYyk7dmFyIFE9Yy5ta3x8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9CmF8fHt9fWMubGs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi50dD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Hcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmJxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHc9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ZZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5RZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIiwKbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlZmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlpmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5Sbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5UZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkp2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gcz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5jcT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmxnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmZkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuemM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlhmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5Ubj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IiwKbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlhjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5hZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5jZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuU249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmtpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuSXM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi52ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi52Zj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9OwpiLm1nPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5jdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Gdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3Y9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkV2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuSHM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpOwp2YXIgaz1jLmxrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnp0PXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbNV07dGhpcy5Hbz10aGlzLmFbNl07dGhpcy5HdT10aGlzLmFbNF07dGhpcy5McD10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLllsPWI7Yi5wcm90b3R5cGU9e3l0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56dDp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVzOnRoaXMucmsoYSl9LHJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zazp0aGlzLkZvKGEpfSxGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdvOnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HdTp0aGlzLktwKGEpfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTHA6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgamE9Yy5ZbHx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMueXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5uaz1iO2IucHJvdG90eXBlPXtBZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCsKbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxCcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxuZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMubmQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5uZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPQphLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxrYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkFlKHRoaXMubGEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5uZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sdHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYSgpKyIyIn0sWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5BZSh0aGlzLkJxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubmQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMubmt8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmhsPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs3XTt0aGlzLnF3PXRoaXMuYVs5XTt0aGlzLkN1PXRoaXMuYVs0XTt0aGlzLkF1PXRoaXMuYVsxMF07dGhpcy5pdD10aGlzLmFbNl07dGhpcy5mdz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs2XX1jLnByPWI7Yi5wcm90b3R5cGU9e2dsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5obDp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXI6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnF3OnRoaXMuQnUoYSl9LEJ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5DdTp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQXU6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml0OnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLnByfHxrYSx3Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5nbCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PQp0eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MubGo9Yn0pKGMpO3ZhciBMPWMubGp8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnY9dGhpcy5hWzJdO3RoaXMudnM9dGhpcy5hWzZdO3RoaXMuaHI9dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMV19Yy4kcD1iO2IucHJvdG90eXBlPXtxdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucnY6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZzOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ocjp0aGlzLlZtKGEpfSwKVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLldtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgbGE9Yy4kcHx8bGEseGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eGMucXYoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5lbT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLk1hPXt9O3RoaXMuST1udWxsO3RoaXMuTGM9MTAwO3RoaXMuSWI9MDt0aGlzLldhPTE1MDt0aGlzLkxiPTA7dGhpcy5sdShiKX0sZzpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2E/KHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuTGMpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLAp0aGlzLkxjKSl9LGF1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWI+dGhpcy5XYT8hMDohMX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLkliPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdTpmdW5jdGlvbihiKXt0aGlzLkk9Yn0senE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JfSxSOmZ1bmN0aW9uKGIpe2UudHJhY2soInN0YXRzX3BsYXllciIsYi5QKCksITApO3RoaXMuTWFbYi5sYSgpXT1iO00mJk0uaGgmJk0uT3UoYil9LGZ4OmZ1bmN0aW9uKCl7cmV0dXJuIGUueWUodGhpcy5NYSl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxoO2ZvcihoIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtoXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfSxEcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHh4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09Cm51bGx9fSl9KShjKTt2YXIgdD1jLmVtfHx0OyhmdW5jdGlvbihjKXtjLmdtPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuTGM9MTA7dGhpcy5JYj0wO3RoaXMuV2E9NTA7dGhpcy5YPW51bGw7dGhpcy5uYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuQmI9IiI7dGhpcy5yZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsaD10aGlzLkthKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1oKWIuY29udGFpbmVySWQ9aC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSx2dTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSxvdTpmdW5jdGlvbihiKXt0aGlzLlBlPQpifSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBlfSxPZTpmdW5jdGlvbigpe30sVDpmdW5jdGlvbigpe3RoaXMuSWI8PXRoaXMuV2EmJih0aGlzLkliKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy5MYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSwKRmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGQ6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSx6eDpmdW5jdGlvbigpe30sWjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5TcSgpfHx0aGlzLlZuKCk7dGhpcy5EZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LGh4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LFZuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmFhKDEwKSl9LFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYX0sY2E6ZnVuY3Rpb24oKXt0aGlzLm5hPSEwfSxNYzpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJgpiLm11dGVkP2IubXV0ZWQ6ITF9LEplOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExoOmZ1bmN0aW9uKGIpe3RoaXMuQmI9Yn0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYn0sR2g6ZnVuY3Rpb24oKXt0aGlzLkJiPW51bGx9LGp4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5CYiYmKGI9ITApO3JldHVybiBifSx1eDpmdW5jdGlvbigpe3RoaXMucmd8fCh0aGlzLnJnPSEwKX0sdmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYXg6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuZ218fHA7KGZ1bmN0aW9uKGMpe2Mud2k9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLkk9dGhpcy5wbGF5ZXI9IiI7dGhpcy5NZj0iMSI7dGhpcy5OZj0iMiI7dGhpcy5Jbj0iMyI7dGhpcy5UYz0wO3RoaXMub2g9MzA7dGhpcy5SYj1bXTt0aGlzLmhiPVtdOwp0aGlzLnBjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLiRmPXRoaXMuZ2k9ITE7dGhpcy5zdGF0dXM9dGhpcy5UYzt0aGlzLmlkPWUuYWEoMTApO3RoaXMuaGYoYik7dGhpcy5tdShhKX0sZzpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLmdpfHwodGhpcy5naT0hMCxlLk1lKCkpfSxUZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1ImJlIuYmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHNyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPW5ldyBKO3dpbmRvd1thLmthKCldfHwod2luZG93W2Eua2EoKV09e30pO3dpbmRvd1thLmthKCldW2IubGEoKV18fCh3aW5kb3dbYS5rYSgpXVtiLmxhKCldPXt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWmIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlpiKCldPwp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV0rKzp3aW5kb3dbYS5rYSgpXVtiLmxhKCldW2UuWmIoKV09MX0sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9ITAsaD1uZXcgSjt3aW5kb3dbaC5rYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXSYmd2luZG93W2gua2EoKV1bYi5sYSgpXS5pbml0aWF0b3IhPWUuWmIoKSYmKHRoaXMuamYoKSxhPSExKTtyZXR1cm4gYX0sRzpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtpZighdGhpcy54YSgpKXt0aGlzLnNyKCk7aWYoIXRoaXMuQXIoKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMuamYoKTtyZXR1cm59dGhpcy5qZigpO3RoaXMuSSh0aGlzLmdldFBsYXllcigpLGgpO3RoaXMuJGgoKTt0aGlzLiRmPSEwO2EmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksCnRoaXMuaGIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LCRoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5SYiYmMDx0aGlzLlJiLmxlbmd0aCYmKHRoaXMuUmI9ZS51bmlxdWUodGhpcy5SYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuUmIuam9pbigiLCIpKSk7aWYodGhpcy5oYil7Zm9yKHZhciBoPTA7aDx0aGlzLmhiLmxlbmd0aDtoKyspdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl09PXRoaXMucGNbYl0mJmEucHVzaCh0aGlzLmhiW2hdLmRldGFpbCksdGhpcy5wY1t0aGlzLmhiW2hdLnJlYXNvbl08dGhpcy5wY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuaGJbaF0uZGV0YWlsKSxiPXRoaXMuaGJbaF0ucmVhc29uKTt0aGlzLnBjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0saXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZn0sCnc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1mfSxqZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTmZ9LHR1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Jbn0sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjfSxTZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0sUnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuTmZ9LHhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLlRjfSxoZjpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LG11OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx6cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LG1zOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy53aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUW49dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzZdO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMudms9YjtiLnByb3RvdHlwZT17UG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFuOnRoaXMuQ3AoYSl9LENwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EcDp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgbmE9Yy52a3x8bmEseWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMuUG4oNCk7KGZ1bmN0aW9uKGMpe2MuVmo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuVmp8fG9hOyhmdW5jdGlvbihjKXtjLldqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5TdzthP2EucWE/YS5xYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0KITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucmEoKSk6KHRoaXMudSgiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy51KCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgcGE9Yy5Xanx8cGE7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgcGEoYix0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHFhPWMuWGp8fHFhOyhuZXcgcWEocikpLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5UcD10aGlzLmFbOF07dGhpcy5UaT10aGlzLmFbMl07dGhpcy5Mbj10aGlzLmFbMl07dGhpcy5ubT10aGlzLmFbNF07dGhpcy55bz0KdGhpcy5hWzVdO3RoaXMuUXI9dGhpcy5hWzddO3RoaXMubHc9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuTm89dGhpcy5hWzVdO3RoaXMuTmw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNV19Yy5odj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHA6dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRpOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5tOnRoaXMueG8oYSl9LHhvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueW86dGhpcy5QcihhKX0sUHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFyOnRoaXMua3coYSl9LGt3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sdzp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5NbyhhKX0sCk1vOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Obzp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLmh2fHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5TcCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3RoaXMud2coKTt0aGlzLnlnKCk7dGhpcy5wcD0hMX0sd2c6ZnVuY3Rpb24oKXt0aGlzLmNjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5jYz0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj0KYi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seWc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuY2M9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmCnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5GZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcykpfSxGZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiYKYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlBlJiYoMCx0aGlzLlBlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sCnVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Pa3x8c2E7KGZ1bmN0aW9uKGMpe2MuTms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuVmM9ITE7dGhpcy5iZT0xO3RoaXMuV2M9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmCihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYmU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsCmN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5WYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5UZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJgpiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMub2gmJiF0aGlzLnhhKCkmJih0aGlzLnZiPyh0aGlzLnUoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS55ZCgpLGEucWUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuVmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5UZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5vaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLldjLmluZGV4T2YoYSkmJgp0aGlzLldjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5XYy5sZW5ndGg+PXRoaXMuYmUmJnRoaXMubSgpKX0sbXM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy50ZT90aGlzLnRlKys6dGhpcy50ZT0xOnRoaXMuc2U/dGhpcy5zZSsrOnRoaXMuc2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2Uub2YoYS52aWRlb1RhZyk/YS5jYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlZjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMuc2U+dGhpcy50ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLndnKCksYS55ZygpLGEuY2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Oa3x8dGE7KGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy53cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkRyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sY3g6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCndxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Qa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLm9xPXRoaXMuYVszXTt0aGlzLm93PXRoaXMuYVszXTt0aGlzLmxwPXRoaXMuYVs3XTt0aGlzLnl2PXRoaXMuYVs4XTt0aGlzLkpwPXRoaXMuYVszXTt0aGlzLnRvPXRoaXMuYVsyXTt0aGlzLlltPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLiRrPWI7Yi5wcm90b3R5cGU9e0VsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GbDp0aGlzLm5xKGEpfSxucTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMub3E6dGhpcy5udyhhKX0sbnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm93OnRoaXMua3AoYSl9LAprcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHA6dGhpcy54dihhKX0seHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnl2OnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcDp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG86dGhpcy5YbShhKX0sWG06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlltOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy4ka3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuRWwoNCk7KGZ1bmN0aW9uKGMpe2MubW49cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT0KYi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LEVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYKIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpOwp2YXIgeGE9Yy5tbnx8eGE7KGZ1bmN0aW9uKGMpe2MubG49di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZmk9ITA7dGhpcy51Yz10aGlzLldnPSExO3RoaXMuRXMoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnJoKCksdGhpcy5ZbygpLHRoaXMucmIoKSl9LEVzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LHZ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwKIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT8KYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS4kZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLiRkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouJGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5xYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwKIjsiLGIuaW1hP2IuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5pZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmllOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQmgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sClliOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxKZzpmdW5jdGlvbigpe2lmKCF0aGlzLkZjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRmM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkZjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRmN9LEJyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuenIoKTt3aW5kb3cuaW1hJiZiJiYKKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5WZz0hMCl9cmV0dXJuIHRoaXMuVmd9LHpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy4kYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuJGM9ITApO3JldHVybiB0aGlzLiRjfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWWIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5UdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmhhKGEsCiEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJiKCl9LmJpbmQodGhpcyksMjApfSxUdDpmdW5jdGlvbigpe3RoaXMudWM9ITA7dmFyIGI9dGhpcy5KZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnZjPSEwO2lmKGUuZmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIiwKZnVuY3Rpb24oKXt0aGlzLnZjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGJ4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5vZyYmYi5hZHMmJih0aGlzLm9nPWIuYWRzKTtyZXR1cm4gdGhpcy5vZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpOwp0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlRlKCl9LmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59YiYmKChiPXRoaXMuSmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoKX0uYmluZCh0aGlzKSw1MCkpfSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5CcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlliKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlliKCksdGhpcy51Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5XZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuWWIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmdhKCkpOgoodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuV2c9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLkFjfHwodGhpcy5BYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuQWMhPWIuYWRzLnN0YXRlJiYodGhpcy5BYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5BYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkFjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5abygpfS5iaW5kKHRoaXMpLAoxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS4kYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmZpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmZpLGZ1bmN0aW9uKCl7dGhpcy5oZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxncDpmdW5jdGlvbigpe3RoaXMua3h8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSwKd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLlF2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuJHQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sJHQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5sbnx8eWE7KGZ1bmN0aW9uKGMpe2Mubm49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlJoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5SaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxSaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnllKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5MYyl9fSl9KShjKTsKdmFyIHphPWMubm58fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbT10aGlzLmFbMV07dGhpcy5Qaj10aGlzLmFbMTBdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMuUnA9dGhpcy5hWzJdO3RoaXMuSHA9dGhpcy5hWzJdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMubm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5Daj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY206dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlBqOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bdjp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnA6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhwOnRoaXMueHcoYSl9LAp4dzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXc6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5Danx8QmEsQmM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuYm0oNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5WZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTsKcmV0dXJufXRoaXMuVyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sdXQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMubGEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuYmMmJigwPD1oLmluZGV4T2YoZCl8fGEueWQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlZlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCkFhOmZ1bmN0aW9uKCl7dGhpcy5WZSsrO2lmKDEwPHRoaXMuVmUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE5hOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBDYT1jLlJsfHxDYTsoZnVuY3Rpb24oYyl7Yy5RbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe2lmKCF0aGlzLnVlKWlmKHRoaXMuRGJ8fCh0aGlzLkRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuRGIrKywxNTx0aGlzLkRiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9fSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxoYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9CiEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLkNhKCk7CnZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuZnE/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLmZxPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IudXQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBEYT1jLlFsfHxEYTsoZnVuY3Rpb24oYyl7Yy5TbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYKKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubmF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLlNsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG89dGhpcy5hWzddO3RoaXMuTGk9dGhpcy5hWzZdO3RoaXMucm89dGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzldO3RoaXMuSWk9dGhpcy5hWzVdO3RoaXMuVXI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Lcj1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUG86dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5MaTp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucm86dGhpcy5PbShhKX0sT206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlBtOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JaTp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBHYT1jLktyfHxHYSxDYz1uZXcgR2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5Pbyg0KTsoZnVuY3Rpb24oYyl7Yy5Maz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5HZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmCihhPWEucGFyZW50Tm9kZSl9dGhpcy5BdD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2guc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7aC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQXQpe2Nhc2UgImJlZm9yZSI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEpO2JyZWFrO2Nhc2UgImFmdGVyIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjphLmFwcGVuZENoaWxkKGgpO2JyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVyhoKTt0aGlzLlooaCk7CnRoaXMubGQ9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5sZCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZwOmZ1bmN0aW9uKCl7ZS5iaCh0aGlzLmxkKTtlLkZlKHRoaXMubGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mcCgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxKZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEhhPWMuTGt8fEhhOyhmdW5jdGlvbihjKXtjLktrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnUoImV4dGVybmFsIik7dGhpcy5HKCEwKX19KX0pKGMpO3ZhciBJYT1jLktrfHxJYTsoZnVuY3Rpb24oYyl7Yy5Naz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLldhPTE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBiPQpsLmlucmVhZCxhPWUuR2coYiwiZWxlbWVudElEIik7aWYoZS5iaChhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5MYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5MYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy5Na3x8SmEsS2E9bmV3IEphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5qPXRoaXMuYVs0XTt0aGlzLkpvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuVmw9YjtiLnByb3RvdHlwZT17TWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oajp0aGlzLklvKGEpfSxJbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSm86dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5WbHx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuTWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLm9rPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG51OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sV246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5va3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsCmQsZil7dGhpcy4kYT1hO3RoaXMuQmc9dGhpcy5vaT0hMTt0aGlzLnNoPWQ7dGhpcy5TaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeihhKSk7dmFyIGM9dGhpcy5nYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5JZSh0aGlzLiRhLnVybCkmJm0uT2Qpe3ZhciBlPW5ldyB6KGEudXJsKTtlLm51KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMucGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQmcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuZ2IudXJsQ2FsbGVkPXRoaXMuJGEudXJsO3RyeXt0aGlzLlNoP3RoaXMuZ2Iub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5nYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLm9pfHwodGhpcy5nYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJgp0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmdiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmdiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5JZSh0aGlzLiRhLnVybCk/bS5PZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkllKHRoaXMuJGEudXJsKSx0aGlzLnNoJiZ0aGlzLnNoKCl9cmV0dXJuIHRoaXMuZ2J9fX0pKGMpO3ZhciBNYT1jLnBrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5XZD0hMX1jLm1qPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3RoaXMuV2Q9YX0scXU6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtCdzoiQWRDbGlja1RocnUiLER3OiJBZEVycm9yIixFdzoiQWRTdG9wcGVkIixIdzoiQWRMaW5lYXJDaGFuZ2UiLEl3OiJBZFRhZ1BhcnNlZCIsTHc6IkFkVmlkZW9Db21wbGV0ZSIsT3c6IkFkTG9hZGVkIixQdzoiQWRTa2lwcGVkIixRdzoiQWRTdGFydGVkIixGdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEd3OiJBZEltcHJlc3Npb24iLEN3OiJBZENyZWF0aXZlVmlldyIsSnc6IkFkVmlkZW9NaWRwb2ludCIsS3c6IkFkUGF1c2VkIixNdzoiQWRWaWRlb1N0YXJ0IixOdzoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmEodGhpcy5XZCxiW2RdKX0sWHQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlZkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlZkKXRoaXMuSGEuVmQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlZkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldkJiZ0aGlzLll0KCk7dGhpcy5IYSYmdGhpcy5YdCgpfX19KShjKTt2YXIgTmE9Yy5tanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPQohMTt0aGlzLnhjPSIiO3RoaXMuamU9dGhpcy53Yz10aGlzLndiPW51bGw7dGhpcy56cD10aGlzLkpiPXRoaXMuamg9ITE7dGhpcy5MYT0iIjt0aGlzLmVoPSExO3RoaXMud2E9dGhpcy5xZD0iIjt0aGlzLiRnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLmFmPSExO3RoaXMucGE9W107dGhpcy5QZz10aGlzLmdjPSIiO3RoaXMucmU9ITE7dGhpcy5zZj0wO3RoaXMuSGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5GZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMub2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmljPSIiO3RoaXMuamM9W107dGhpcy5rYz1bXTt0aGlzLktkPVtdO3RoaXMuaGM9IiI7dGhpcy50Zj0KMDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5FYz0hMTt0aGlzLmhwPXRoaXMuUWQ9bnVsbDt0aGlzLk5oPXRoaXMubWM9dGhpcy50Zz10aGlzLndmPXRoaXMuT2Q9dGhpcy5sZT10aGlzLlVjPSExO3RoaXMuaWI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucmQ9MDt0aGlzLlJnPSExO3RoaXMuUWc9MUUzO3RoaXMuYmQ9ITE7dGhpcy5RYT0xRTM7dGhpcy5QZj0iIn1jLnFrPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMueGMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy53YyxhZHRhZ3JlZ2V4OnRoaXMuamUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuamgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMuenAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5laCxnbG9iYWxDb25maWc6dGhpcy5xZCwKY2xpZW50Q29uZmlnOnRoaXMud2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLiRnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmdjLGhvbWFkQWRwYXRoOnRoaXMuUGcsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5yZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5zZixIT01BRF9WRVJJRklFRDp0aGlzLkhmLEhPTUFEX0JMT0NLRUQ6dGhpcy5GZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5vYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuR2YsdGVzdEhpZGU6dGhpcy5pYyx0ZXN0VGFnczp0aGlzLmpjLHRlc3RUYWdzSlM6dGhpcy5rYyx0ZXN0VGFnc1hIUjp0aGlzLktkLHRlc3RDb29raWU6dGhpcy5oYyx0aHJvdHRsZTp0aGlzLnRmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlVjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMubGUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuT2QsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMud2YsY29uZmlnRmFpbHVyZXM6dGhpcy5pYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5LaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMua2IsdnBhaWQ6dGhpcy5tYyxza2lwQWxsb3dlZDp0aGlzLk5oLHZtYXBzOnRoaXMubGksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLmJkLGFkRmFsbGJhY2tVUkw6dGhpcy5QZn19LFFxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmliKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaWJbYl0mJjE9PXRoaXMuaWJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5pYltiXSYmMT09dGhpcy5pYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSmQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5IbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkhlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkdjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5LYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnhjfHx0aGlzLndifHx0aGlzLndjfHx0aGlzLmplKSYmKGc9dGhpcy54cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnlxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5HYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sR2M6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuSGUoYSk7cmV0dXJuIGJ9LHlxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5YdztyZXR1cm4ibm9uZSJ9LHNkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5LaF19LEtjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZCgpLGI9dGhpcy5NaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxwaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx3czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5waChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMucGgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx4czpmdW5jdGlvbihhKXt0aGlzLnhjJiYoYSs9dGhpcy54Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMud2MmJihhPXRoaXMud3MoYSx0aGlzLndjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi5ydShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIucXUoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZWg9ITA7dGhpcy5xZD1hO3RoaXMud2E9Yjt0aGlzLmFmPWQ7dGhpcy5RZD1mO3RoaXMuQmM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmhzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuZnMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueWMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLnFkK3RoaXMuZ2UoImdsb2JhbCIpKSx0aGlzLk1xLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LGZzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZ2UoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy55Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGdlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmxlKXt0aGlzLmxlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkJjPSExKTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuJGc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLkZmKSk7dGhpcy5OYigpO2UuQ2Moay50dCk7KGI9ZS4kYih0aGlzLnNkKCkpKXx8KGI9ZS4kYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sTXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmdjfHx0aGlzLkxhfHx0aGlzLnljKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHljOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuR2MoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmdjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuUGc9YS5hZHBhdGh8fCIiO3RoaXMucmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5LaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkhjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxIYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLktjKCkpLGQ9dGhpcy56YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMuZ2UoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlJ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmZmKCJjdXN0b21lciIpO2E/dGhpcy55bT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLnltPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5IYyghMCl9LmJpbmQodGhpcyksITApfX0sUnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5FYz0hMDt0aGlzLkhjKCEwKTtyZXR1cm59fXRoaXMuT2Q9dGhpcy5NYihiLnN0cmljdCk7dGhpcy53Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnRnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5rYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5LZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy53Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuamU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuamg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubWM7dGhpcy5OaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmNkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5saT1iLnZtYXBzfHwiIjt0aGlzLmJkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5QZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkZxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5yZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy50Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkVjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5FYz0hMCx0aGlzLkhjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLktkKT90aGlzLmFmPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5RYikpLHRoaXMubmUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmtkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFBjOmZ1bmN0aW9uKGEpe3RoaXMuVWM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnFiKGEpKSx0aGlzLk5iKCksdGhpcy5uZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmljKXt2YXIgYT1lLmtkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5paCgpKXRoaXMuUGModGhpcy5vYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuV2goKX19ZWxzZSB0aGlzLldoKCl9LFZoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5wZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUGModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuS2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBmKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxXaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVmguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlBjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVmgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxwZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMuc2YrKyx0aGlzLkRhKG5ldyB6KHRoaXMuaGMpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMucWYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5UaCgpfSxxZjpmdW5jdGlvbihhKXt0aGlzLlBjKHRoaXMuR2YsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5zZj90aGlzLnBmKCk6dGhpcy5xZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlRoKCk6dGhpcy5xZigiQUFBIil9LFRoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5xYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubmUoKX0saWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlVjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmloKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucWIodGhpcy5IZikpO3RoaXMuUWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5RZCYmdGhpcy5RZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMud2YmJnRoaXMuUXEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sJGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5RZyYmIXRoaXMuUmcmJih0aGlzLlJnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5RZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEub2k9ITApO3EmJmUuRXIoKSYmKGEuQmc9ITApO2cmJihhLlNoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmJiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5HYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sVXU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmxpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLkl2LmJpbmQodGhpcyksdGhpcy5Idi5iaW5kKHRoaXMpKX0sSXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LEh2OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkNjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG5lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmJiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYmIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sa3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy50Zn0sRnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LE1oOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5xa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhrPXRoaXMuYVs4XTt0aGlzLmpsPXRoaXMuYVs4XTt0aGlzLk9yPXRoaXMuYVs3XTt0aGlzLm1yPXRoaXMuYVs4XTt0aGlzLk5wPXRoaXMuYVs0XTt0aGlzLmpuPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuYXE9YjtiLnByb3RvdHlwZT17d2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnhrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9yOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXI6dGhpcy5NcChhKX0sTXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5wOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7CnZhciBQYT1jLmFxfHxQYSxFYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy53ayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLmYuUD90aGlzLmViPWEuZi5QKCk6dGhpcy5lYj0iIjthLmYuWWcmJmEuZi5ZZyh7cGF1c2U6dGhpcy55ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLkloLmJpbmQodGhpcyksbXV0ZTp0aGlzLlFlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMudXYuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5qYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLldiPXRoaXMuYWQ9ITE7dGhpcy5Cbz0xRTM7dGhpcy50YT1udWxsO3RoaXMuTD1iO3RoaXMuUGI9e307dGhpcy52aWRlbz17fTt0aGlzLkhkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLlJvPWUuYWEoMTApOwp0aGlzLm1mPTA7dGhpcy5aYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlpjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYucyYmKGE9dGhpcy5iLmYucygpKSx0aGlzLlpjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLmJvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMudGg9dGhpcy5HZD0hMTt0aGlzLm1oPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5mZT0hMTt0aGlzLmNpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuYmM9ITE7dGhpcy5ycD1lLmFhKDEwKTt0aGlzLkdiPWUuYWEoMTApO3RoaXMuRWI9ZS5hYSgxMCk7dGhpcy5PaD1lLmFhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SZD0KdGhpcy5PYj10aGlzLnBlPXRoaXMuZ2Q9dGhpcy5JZD10aGlzLnNiPXRoaXMubmM9dGhpcy52aD10aGlzLm1kPXRoaXMubHY9dGhpcy51Yj10aGlzLkZiPSExO3RoaXMuc2M9W107dGhpcy5kYz17fTt0aGlzLmp0PTIwMDt0aGlzLkRmPXRoaXMuUWM9dGhpcy5rZT10aGlzLkNmPXRoaXMuJGU9ITE7dGhpcy54ZD17fX1jLmtrPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LGFpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkNiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuWmEoKSwhMCk7dGhpcy5LdSgpO2UudihrLlRuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LExlOmZ1bmN0aW9uKGEsYixjLGYpe3RoaXMudWI9CmM7dmFyIGc9ITE7ZiYmZi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5WKXRoaXMubWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuY3AoKSxmPW0uZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmFpKCksbmV3IFModGhpcyxhLHRoaXMubWgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpmLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuYWkoKSxuZXcgUyh0aGlzLGEsdGhpcy5taCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmYuUWEsa2VlcFVSTDohMCwKaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLkxlKGEsYixjKX0sNTApfX0sV2U6ZnVuY3Rpb24oYSl7YS5hYiYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlJkPXRoaXMuT2I9dGhpcy5tZD0hMTt0aGlzLmM9YTt0aGlzLnd1KHRoaXMuYyk7dGhpcy54ZD1uZXcgUWEodGhpcy5jLkt2LHRoaXMudmlkZW8se30pO3RoaXMuTWcoYSk7dGhpcy5zYz10aGlzLkRnKGEpO3RoaXMubXAoKX0sTWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSGQ9dGhpcy5JcShhKSksdGhpcy5NZyhhLnBhcmVudCkpfSxEZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkRnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuc3EoYSkpKTtyZXR1cm4gY30sc3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LElxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJgooZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5sYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxzYTpmdW5jdGlvbihhKXthLmFiJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuamQmJmEuamQuZXJyb3ImJmEuamQuZXJyb3IuY29kZSYmCihiPWEuamQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUcuWGQuY29kZT9lLnYoay5kdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOihlLk1lKCksYj09Ry5LZi5jb2RlJiZlLnYoay5Gcyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKTtlLnYoay5icSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuTHUoKTt0aGlzLlhhKCJlbXB0eSIpO2JyZWFrO2Nhc2Ugdy5JZi5jb2RlOmUudihrLkp2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHcuTGYuY29kZTplLnYoay5ndyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5ZZC5jb2RlOmUudihrLmh3LHRoaXMuYy5CLAp0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB3LlVkLmNvZGU6ZS52KGsuR3MsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB3LlRkLmNvZGU6ZS52KGsuRnYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuR3YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5YYSgidW5rbm93biIpfXRoaXMuWGIoYSk7dGhpcy5SYSgpfSxYYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9CmEuUGEucG9wKCk7dGhpcy5LZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5wZT0hMTt0aGlzLlBiPXRoaXMuYi5LO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLlBiLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBjPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGMmJmMuZW52dmFycyl0cnl7Yj1jLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy4kZT0hMH1jYXRjaChmKXt9fWNhdGNoKGUpe31iLnd4PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuYm8mJnRoaXMucGxheWVyLnZlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci52ZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5PLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk9bY10udHlwZSkmJnRoaXMuWG4oYixhLk9bY10udXJsKyIiLGEuT1tjXS50eXBlKTt0aGlzLiRlJiZiLmxvYWQoKTtpZih0aGlzLlhoKGIpKXt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt0aGlzLiRuKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMudGE9CnRoaXMuUGIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuJGU/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLm5wKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5QYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYiksdGhpcy51dSgpKTp0aGlzLmMub3JpZ2luLnVnKHcuVWQpfSx1dTpmdW5jdGlvbigpe3RoaXMuQ2Y9ITA7dGhpcy5zYj10aGlzLm5jPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnNiPSEwKTtlLm9lKCk7dGhpcy5jJiYKdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi52YSYmZS5hbyh0aGlzLmMub3JpZ2luLnZhKTt0aGlzLlBoKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1FLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLndoKCk7dGhpcy5iLmtmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5rZigpO3RoaXMudGE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLmhpKCJ2cGFpZCIpO2lmKHRoaXMuc2Ipe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5LYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuTHEoKSxjPXRoaXMuYy5CLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsCmRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLm1hKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuZGcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmhlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXt0aGlzLmIuZi5BYSYmCiF0aGlzLklkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay56Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5hYyghMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5zYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLlN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuVHYoKSx0aGlzLmIuYWMoITApLCF0aGlzLk9iKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTsKdGhpcy5PYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5SZD0hMDtlLnYoay5raSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5HZSh0aGlzLk9iKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuYWMoITApLHRoaXMuWHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLmFjKCEwKSx0aGlzLmF3KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuYncoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuWXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubWkoKTtpZigiQWRDbGlja1RocnUiPT0KYS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLlZiKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e2lmKHRoaXMuTC5iZHx8dGhpcy5RYylhPSJfYmxhbmsiO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChjKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5XdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuY2UsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmCnRoaXMuVXYoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlFjJiYodGhpcy5EZj0hMSx0aGlzLmZjKCkpLHRoaXMuVnYoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5zYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnZkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpOih0aGlzLnNiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxlLnYoay5jZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKSl9fS5iaW5kKHRoaXMpKTtlLmhlKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO2UuaGUoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuYWcoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxVdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuYWUsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMubmM9ITB9LFZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuWGMsCnRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5uYz0hMX0sWHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5ZZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxXdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5YZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxUdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTt0aGlzLlFoKCk7ZS52KGsuVGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuWWEoInN0YXJ0Iik7ZS52KGsuWGMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy5tZD0hMDt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7CmUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LCR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTt0aGlzLllhKCJtaWRwb2ludCIpO2UudihrLlZmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMueWYoKTt0aGlzLllhKCJjb21wbGV0ZSIpfSxtaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXt0aGlzLlhhKCJ2cGFpZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTsKZS5vZSgpO3RoaXMuSD0hMTt0aGlzLlJhKGEpfX0sU3Y6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZzshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csYi5tYXRjaChjKSk7dGhpcy5YYSgidnBhaWRlcnJvciIpO2UudihrLmN3LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5taSghMCl9LFhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi5HYygpKXt2YXIgZD1iLnphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIiwKYyhiLHRoaXMuTCkpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sJG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaWkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5BZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5paS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLkFmLmJpbmQodGhpcykpOwphLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnpmLmJpbmQodGhpcykpfSxpaTpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2J8fHRoaXMuQWYoYSl9LmJpbmQodGhpcyksdGhpcy5CbykpfSxBZjpmdW5jdGlvbihhKXtpZighdGhpcy5hZCYmdGhpcy5YaCh0aGlzLnZpZGVvKSYmIXRoaXMuRmImJiF0aGlzLldiKXt0aGlzLmFkPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5GYnx8KHRoaXMuRmI9ITAsdGhpcy5DZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLAp0aGlzLlphKCksITApLHRoaXMuTC50Z3x8dGhpcy5MLmlhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuTXYoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5rZigpO3RoaXMuTHYoKTt0aGlzLmhpKCk7dGhpcy5lZygpO3RoaXMuYi53aCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5uZigpfX0sbmY6ZnVuY3Rpb24oKXt0aGlzLmdkfHx0aGlzLlJmKCl9LFJmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuZ2R8fChhP3RoaXMuUmEoKToodGhpcy5RZSghMCksdGhpcy5SZighMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmZlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5uZigpKX0uYmluZCh0aGlzKTt0aGlzLnhlKCkuTGgodGhpcyl9LHlmOmZ1bmN0aW9uKCl7dGhpcy5MLmtiJiYhdGhpcy5GYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLlJuLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5SYSgpfSxVbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspYz1lLkhnKGFbZl0pLGIucHVzaChjKTthPXtoYXNoZXM6Yn07YT1rLlRhKGEsdGhpcy5BKCkpO2UuSXUoYSl9LFJhOmZ1bmN0aW9uKGEpe3RoaXMuYyYmCnRoaXMuYy5TZCYmdGhpcy5Vbih0aGlzLmMuU2QpO2lmKCF0aGlzLnBlKWlmKHRoaXMucGU9ITAsdGhpcy5SZHx8KGUudihrLklzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnRifHx0aGlzLmMucWMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMubWYrKzt0aGlzLldiPXRoaXMuYWQ9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkdkPSExO3RyeXt0aGlzLmIuZWkoKX1jYXRjaChnKXt9dGhpcy5JZD0hMDt0aGlzLmIuQmUoKTt0aGlzLmJjPSExO3RoaXMueGUoKS5HaCgpO3RoaXMuYy50YiYmdGhpcy5jLm9yaWdpbi5SZSgpO3RoaXMuYy5xYyYmKGE/dGhpcy5jLm9yaWdpbi5xaCgpOgp0aGlzLnFlKCkpfWVsc2UgdGhpcy5xZSgpfSxQdjpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMuemYoYSkpfSx6ZjpmdW5jdGlvbihhKXt0aGlzLldiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC5hcCgpO3RoaXMuYy5vcmlnaW4udWcody5VZCl9LGppOmZ1bmN0aW9uKCl7aWYodGhpcy5sdil0aGlzLlJhKCk7ZWxzZXt0aGlzLmJjPSEwO3RoaXMuYi5mLkFhJiYhdGhpcy5JZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsuemMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt2YXIgYT0KTWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnB2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmtpLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkdlKHRoaXMuT2IpfWM9IiI7dGhpcy5jLmxmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9oKSkmJihjPXRoaXMuYy5sZi0KYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5jLnRiPyh0aGlzLldiPXRoaXMuYWQ9ITEsdGhpcy5DZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkdkPSExLHRoaXMuYi5laSgpLHRoaXMuYy5vcmlnaW4uUmUoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWMpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5aYy5yZXBsYWNlKCJbdGltZV0iLAplLkNnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuZmU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGJpOmZ1bmN0aW9uKCl7dGhpcy52aHx8KHRoaXMudmg9ITAsdGhpcy5tZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHB2OmZ1bmN0aW9uKGEpe2UudihrLmNlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7YT09dGhpcy5jaXx8dGhpcy5GYnx8KDA9PWEmJih0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmJpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5iaSgpfS5iaW5kKHRoaXMpKSx0aGlzLkZifHx0aGlzLlFoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksCnRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmtiJiZ0aGlzLllhKCJzdGFydCIpLGUudihrLlRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5tZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudihrLlFmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmtiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuWWEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS52KGsuVmYsdGhpcy5jLkIsdGhpcy5iLmYucygpLAp0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwua2ImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5aZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSx0aGlzLmNpPWEpfSxQaDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sS3U6ZnVuY3Rpb24oKXtlLk1kKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFFoOmZ1bmN0aW9uKCl7ZS5NZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLlphKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxMdTpmdW5jdGlvbigpe2UuTWQoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSwKWGE6ZnVuY3Rpb24oYSl7ZS5NZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxZYTpmdW5jdGlvbihhKXsodGhpcy5DZnx8dGhpcy5MLmtiKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LEtiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmtiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuRmIpe3RoaXMueGQmJnRoaXMueGQudHJhY2smJnRoaXMueGQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuSnEodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYKKHRoaXMua2U9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5IZC5pbXByZXNzaW9ucyYmZS5DcihnLnVybCx0aGlzLkhkLmltcHJlc3Npb25zKT90aGlzLktlKGcudXJsLGcudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLnYoay5Tbix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5BKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuS2UoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnhwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5DZiYmKGI9Il92cGFpZCIpO3RoaXMuUWMmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sS2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09CnR5cGVvZiBhJiZhLmxlbmd0aCYmKGI9dGhpcy5MLnlhKGEpLGMmJmIuV24oYyksZnx8KGY9dGhpcy5zZyksZXx8KGU9dGhpcy5zZyksdGhpcy5ZbihhKSx0aGlzLkwuRGEoYixmdW5jdGlvbigpe3RoaXMuRmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sWW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LEZoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sTnU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sSnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx4cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09CmJ9KX0sTXY6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLk52LmJpbmQodGhpcykpfSxOdjpmdW5jdGlvbigpe2UuVmEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVmImJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkwuYmR8fHRoaXMuUWMpYT0iX2JsYW5rIjt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVmJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlZiLGEpfX0uYmluZCh0aGlzKSw1MDApKX0sCkx2OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWmMucmVwbGFjZSgiW3RpbWVdIixlLkNnKDApKTsKdmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmNkJiYoYj10aGlzLkwuY2QpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSl9fSx6YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxFZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmNkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saGk6ZnVuY3Rpb24oYSl7aWYoIWUub2YodGhpcy5jb250cm9scykpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmMuaWQ9dGhpcy5ycDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLnN0eWxlLndpZHRoPSIxMDAlIixjLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5HYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5aaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlpoLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlloLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpOwp2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuRWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm52LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubXYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuRWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkFiKCk7dGhpcy56YigpfS5iaW5kKHRoaXMpKTsKdmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuT2g7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjsKYy5hcHBlbmRDaGlsZChmKTt0aGlzLmMubGYmJmMuYXBwZW5kQ2hpbGQobCk7Yy5hcHBlbmRDaGlsZChnKTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuVmEoKXx8KHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpLHRoaXMudGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy50YS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsCmIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLkJhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmFnKGZ1bmN0aW9uKGEpe3RoaXMuQmEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsubWcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLlFlKCkpO3RoaXMuQWIoKX19LEFiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLkJhJiYiYmxvY2siPT10aGlzLkJhLnN0eWxlLmRpc3BsYXl8fHRoaXMuRGZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5YYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSl9LFpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5uYz8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy5CYSYmKHRoaXMuQmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkFiKCksdGhpcy56YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSx5ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5hZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sSWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlhjLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSwKdGhpcy5BKCkpKX0sbXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsInVzZXIiKSxlLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LG52OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5zYj8oZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnNiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5zYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxRZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5LYigibXV0ZWQiLCJjb250ZW50IiksZS52KGsudmQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LHV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLnYoay52Zix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuZ2R8fHRoaXMuZmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5mKCkpfSxxZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bS5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5rZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLmtlJiZiLmFkRmFsbGJhY2tVUkwpfHx0aGlzLnRofHwhdGhpcy5MLlVjJiYic3BpZWdlbC5kZSIhPWUuJGIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJwcmVyb2xsIiE9ZS5DYj8odGhpcy5nZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLm5nKCkpOih0aGlzLnRoPXRoaXMuUWM9dGhpcy5EZj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5aYSgpLCEwKSx0aGlzLmtlPSEwLGE9ZS5kZyhiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5MZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0sbmc6ZnVuY3Rpb24oYSl7dGhpcy5OdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoITApfS5iaW5kKHRoaXMpLHRoaXMuanQpOih0aGlzLklkPSEwLHRoaXMuYi5CZSgpLHRoaXMuYi5idSgpLHRoaXMuYmM9ITEsCmUudihrLnFwLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy54ZSgpLkdoKCkpfSx4ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxlZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLkZlKHRoaXMudmlkZW8sYSk/dGhpcy5JaCgpOnRoaXMueWQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5WYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnNjJiYwPHRoaXMuc2MubGVuZ3RoJiYoYS5hZElkcz10aGlzLnNjKSk7dGhpcy52aWRlbyYmCnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxBOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5SbysiLSIrdGhpcy5tZjt0aGlzLmMmJnRoaXMuYy5JZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuSWcoKSk7cmV0dXJuIGF9LHNnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUmE9Yy5ra3x8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLlFzPXRoaXMuYVs1XTt0aGlzLm50PXRoaXMuYVsyXTt0aGlzLnV3PXRoaXMuYVs0XTt0aGlzLmNuPXRoaXMuYVs5XTt0aGlzLnVwPXRoaXMuYVs3XTt0aGlzLmtqPXRoaXMuYVsyXTt0aGlzLnVqPXRoaXMuYVs2XTt0aGlzLlVrPXRoaXMuYVs0XTt0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzNdfQpjLnN2PWI7Yi5wcm90b3R5cGU9eyRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hczp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5tdChhKX0sbXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm50OnRoaXMudHcoYSl9LHR3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51dzp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY246dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnVwOnRoaXMuamooYSl9LGpqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5UayhhKX0sVGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Vazp0aGlzLktvKGEpfSxLbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTG86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy5zdnx8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuJHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnJjPXRoaXMudGM9ITE7dGhpcy52YT0iIjt0aGlzLkJmPSExO3RoaXMuVGc9IiI7ZCYmZC5lbXB0eT90aGlzLmxzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2Mua249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUua2QoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5KZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnBnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkpkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5rcy5iaW5kKHRoaXMpLAp0aGlzLmdzLmJpbmQodGhpcykpfSxFZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5IcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5VdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxIcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGtzOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWWQpKX10aGlzLlk9dGhpcy5FZygpO3RoaXMudGM9dGhpcy5yZigpOwp0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlRnPWEudXJsQ2FsbGVkO3RoaXMuWS5sZW5ndGg/dGhpcy5KYygpOnRoaXMuc2EodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkJmP0cuWGQ6Ry5KZn0pKX0sbHM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuR2F8fCh0aGlzLkdhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuc2EodGhpcy5TYSh3LllkKSl9dGhpcy5ZPXRoaXMuRWcoKTt0aGlzLnRjPXRoaXMucmYoKTt0aGlzLnJjPXRoaXMuVWgoKTt0aGlzLlkubGVuZ3RoP3RoaXMuSmMoKTp0aGlzLnNhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5CZj9HLlhkOkcuSmZ9KSl9LGdzOmZ1bmN0aW9uKCl7dGhpcy5zYSh0aGlzLlNhKHcuSWYse2RlcHRoOmF9KSl9LEpjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuWS5zaGlmdCgpO3RoaXMuSnIoKT90aGlzLmZ2KCk/KGErKyxuZXcgYih0aGlzLHRoaXMuTmcoKSxoLHtBZFN5c3RlbTp0aGlzLnJxKCksCnZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnNhKHRoaXMuU2Eody5MZikpOihhPTAsdGhpcy5EdigpJiZ0aGlzLldlKHRoaXMuc3AoKSkpfSxSZTpmdW5jdGlvbigpe3RoaXMudGM/KHRoaXMudGM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSmMoKSk6dGhpcy5wYXJlbnQuUmUoKX0scWg6ZnVuY3Rpb24oKXt0aGlzLnJjPyh0aGlzLnJjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLkpjKCkpOnRoaXMucGFyZW50LnFoKCl9LER2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3YoKT90aGlzLmJ2KCk/ITA6KC0xIT10aGlzLkRjKCk/dGhpcy5zYSh0aGlzLlNhKHcuVGQpKTp0aGlzLnNhKHRoaXMuU2Eody5FZikpLCExKToodGhpcy5zYSh0aGlzLlNhKHcuU2MsRy5LZikpLCExKX0sV2U6ZnVuY3Rpb24oYSl7dGhpcy52YXx8KHRoaXMudmE9IiIpO2EuU2R8fChhLlNkPVtdKTthLlNkLnB1c2godGhpcy5UZyk7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLk5lKCkpOwphLnRiPWEudGI/YS50Yjp0aGlzLnRjO2EucWM9YS5xYz9hLnFjOnRoaXMucmM7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMucGFyZW50LldlKGEpfSxzcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBUYTt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5kdXJhdGlvbj10aGlzLkRjKCk7YS5PPXRoaXMuS2coKTthLlZiPXRoaXMudHEoKTthLkt2PVtdO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMucXEoKTthLmxmPXRoaXMuSHEoYS5kdXJhdGlvbik7YS5hYj1hLmFiP2EuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3JldHVybiBhfSxzYTpmdW5jdGlvbihiKXt0aGlzLnZhfHwodGhpcy52YT0iIik7Yi5hYj1iLmFiP2IuYWI6LTEhPXRoaXMudmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLkFnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT0Kdy5UZC5jb2RlP2IuUGEuY29uY2F0KHRoaXMudXEoKSk6Yi5QYS5jb25jYXQodGhpcy5DcSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LlhiJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuWGImJnRoaXMucGFyZW50LlhiKGIpLGE9MCx0aGlzLkpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuc2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5zYSYmdGhpcy5wYXJlbnQuc2EoYiksYT0wKX0sWGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuWGIoYSl9LHVnOmZ1bmN0aW9uKGEsYil7dGhpcy5zYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBVYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGZ2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sY3Y6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLktnKCkubGVuZ3RofSxidjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuRGMoKX0scmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTwKdGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sVWg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlkmJjI8PXRoaXMuWS5sZW5ndGgmJiF0aGlzLnJmKCkmJihhPSEwKTtyZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oYSl7dGhpcy52YT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnZhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMudmE9IlVOS05PV04ifXRyeXt0aGlzLkJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEpyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5OZygpLmxlbmd0aH0sTmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLndlKHRoaXMuVSwKIkFkU3lzdGVtIil9LE5lOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuYWgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxhaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLmFoKGEucGFyZW50Tm9kZSk6ITF9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09CmEudHlwZX0pfSx1cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sdHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sS2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksWXc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fAoxRTM7dHJ5e3ZhciBoPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5RYSktTWF0aC5hYnMoZC1iLlFhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LHFxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucGQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPQpifWQucHVzaChjKTtlLnB1c2goaCl9MTxhLmxlbmd0aD8oYj1kLGc9aCk6KGI9YyxnPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpnLnRvU3RyaW5nKCl9fSxEYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5IdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/CnRoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHplOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnBkKGEpOiIifSxwZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnplKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5rbnx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5acT10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLkh0PWI7Yi5wcm90b3R5cGU9e1lxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWnE6dGhpcy5pcChhKX0saXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuSHR8fFZhLEdjPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLllxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuUGE9W107dGhpcy5PPVtdO3RoaXMuVmI9IiI7dGhpcy5CPXRoaXMucWM9dGhpcy50Yj0hMTt0aGlzLkNlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5EZT0iIn1jLmRtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LEFxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5HYSl7dmFyIGE9dGhpcy5vcmlnaW4uR2E7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLApiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuQ2U9YVtjXSl9cmV0dXJuIHRoaXMuQ2V9LElnOmZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5EZTt2YXIgYT0iIjsoYT10aGlzLkFxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5EZT1hfSxMcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk8ubGVuZ3RoO2IrKylpZigwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuT1tiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFRhPWMuZG18fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVs0XTt0aGlzLnFsPXRoaXMuYVs5XTt0aGlzLkVpPXRoaXMuYVsxMF07dGhpcy5icj10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlNrPQpiO2IucHJvdG90eXBlPXtwdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucXQ6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRWk6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Ta3x8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMucHQoNCk7dmFyIHc9e1lkOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxFZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsCk9hOiJEVVJBVElPTl9FUlJPUiJ9LFNjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixPYToiRU1QVFlfVkFTVCJ9LExmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxJZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKT2E6IkxPQURfRVJST1IifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx6dzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEc9e0pmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LEtmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LEF3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LFhkOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmRyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuaXI9YjtiLnByb3RvdHlwZT17Y3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5pcnx8WGEsSWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SWMuY3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5lcnJvcj1hO3RoaXMuamQ9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Taj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuU2p8fFVhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJqPXRoaXMuYVszXTt0aGlzLlNyPXRoaXMuYVs1XTt0aGlzLldrPXRoaXMuYVsxMF07dGhpcy5WcD10aGlzLmFbNF07dGhpcy52cj10aGlzLmFbNV07dGhpcy5jcz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5abD1iO2IucHJvdG90eXBlPXtBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5ScihhKX0sUnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNyOnRoaXMuVmsoYSl9LFZrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xazp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy51cihhKX0sCnVyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52cjp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLlpsfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5Baig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuSGg9YTt0aGlzLnZpZGVvPWI7dGhpcy5QZD1bXTt0aGlzLkVoPVtdO3RoaXMuU2U9W107dGhpcy5Pdj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLm9sPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuSGgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5IaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGcpO3ZhciBrPWcuY29udGVudFdpbmRvdztrLnN4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlp0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLlJ0LmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwpsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuUGQucHVzaCh7c3JjOmMsZnJhbWU6ZyxvdDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5TZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLlNlW2JdO2MudHlwZT09PWEmJmMuVm8odGhpcy52cShhKSl9fSx2cTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntCeDohMCxBeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntveDoidmlkZW8iLER4OiJqc0N1c3RvbSIsRXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsRng6MSxadzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEtxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5QZC5sZW5ndGg7YisrKWlmKHRoaXMuUGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5QZFtiXS5vdDtyZXR1cm4iIn0sWnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkVoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLktxKGIpLHZlbmRvcjpifSk7CnRoaXMuSnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk92Lm1hcChmdW5jdGlvbihhKXt0aGlzLmJnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYmcoYSxiKX0sYmc6ZnVuY3Rpb24oYSxiKXt0aGlzLlNlLnB1c2goe3R5cGU6YSxWbzpiLHl4OiExfSl9LEp1OmZ1bmN0aW9uKCl7dGhpcy5FaC5tYXAoZnVuY3Rpb24oYSl7YS5Gcnx8KGEucngoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLkN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Gcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUWE9Yy5vbHx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRms9dGhpcy5hWzVdO3RoaXMuam09dGhpcy5hWzJdO3RoaXMuWG89dGhpcy5hWzldOwp0aGlzLmo9dGhpcy5hWzEwXX1jLnBqPWI7Yi5wcm90b3R5cGU9e0VrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gazp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgWmE9Yy5wanx8WmEsS2M9bmV3IFphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuRWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5qYj1hLkZnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuRD17fTt0aGlzLmNnPSExO3RoaXMuVGI9W119Yy5xaj1iO2IucHJvdG90eXBlPXtwcTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnBxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5WcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDsKZyYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sUXU6ZnVuY3Rpb24oKXt0aGlzLmNnPSEwfSxlaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHdoOmZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCk7ZS52KGsuemMsdGhpcy5mLnMoKSl9LGJ1OmZ1bmN0aW9uKCl7dGhpcy5jZ3x8KHRoaXMuZi5wbGF5KCksZS52KGsuZmQsdGhpcy5mLnMoKSkpfSxrZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5LLnN0eWxlLnpJbmRleD1hO3RoaXMuSy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5qYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuamIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5qYi5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLkYuc3R5bGUud2lkdGg9dGhpcy5qYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD10aGlzLmpiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmpiKTt0aGlzLmYuTWMmJnRoaXMuZi5NYygpP3RoaXMuZi5GZygpLmFwcGVuZENoaWxkKHRoaXMuSyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkspO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LFZxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxpcTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5nZXRQb3NpdGlvbihhKTtiLnBvc2l0aW9uP2IucG9zaXRpb249Yi5wb3NpdGlvbjpiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi53aWR0aD1hLm9mZnNldFdpZHRoO2IuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBifSxhYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKHRoaXMuamIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLk1jKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9CmIud2lkdGgrInB4Ijt0aGlzLksuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5LLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5GLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuVGIubGVuZ3RoO2ErKyl0aGlzLlRiW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUub2YodGhpcy5LKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5hYy5iaW5kKHRoaXMpLDEwKX0sYWc6ZnVuY3Rpb24oYSl7dGhpcy5UYnx8KHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEJlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTsKZm9yKHZhciAkYT1jLnFqfHwkYSxFPVtdLGFiPTA7MTAwPmFiO2FiKyspe3ZhciBOPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Ti5zdHlsZS5kaXNwbGF5PSJibG9jayI7Ti5pZD1lLmFhKDEwKTtOLmNvbnRyb2xzPSEwO0UucHVzaChOKX12YXIgSz0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLlVvPXRoaXMuYVs2XTt0aGlzLkNpPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuY3U9YjtiLnByb3RvdHlwZT17ZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5lbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW86dGhpcy5CaShhKX0sQmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNpOnRoaXMuJGwoYSl9LCRsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5hbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJiPWMuY3V8fGJiLExjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUxjLmRuKDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSwKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5XKGEpO3RoaXMuRGQoYik7dGhpcy5xZygpfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0scWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkthKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxBYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSwKRWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxzOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5LYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGNiPWMuSmx8fGNiOyhmdW5jdGlvbihjKXtjLklsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kYSgpO3RoaXMuU2I9dGhpcy5TYnx8ITE7dGhpcy5VZj10aGlzLldmPXRoaXMuWGc9dGhpcy5lYT10aGlzLnVmPQohMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLmdxKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy51Zj0hMDt0aGlzLlhnJiZ0aGlzLmtnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuQmI7YSYmYS5iYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmRkKCk7dGhpcy5YZz0hMDt0aGlzLmtnKCl9LmJpbmQodGhpcykpO3RoaXMuZ2coKX0sCmtnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuU2Ipe3RoaXMuZGQoKTtpZighdGhpcy51ZiYmIXRoaXMuZGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnVmJiZ0aGlzLlVmJiYhdGhpcy5XZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGRkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxMZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxnZzpmdW5jdGlvbigpe2lmKHRoaXMuZGQoKSl7dmFyIGI9dGhpcy5MZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTsKdGhpcy5XZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlVmPWIuV3d9dGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSwkdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5teCgpOiExfSxEYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuRGMoKTotMX0sRHE6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sZ3E6ZnVuY3Rpb24oYixhKXt0aGlzLlNiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuU2J8fDMwMj09dGhpcy5TYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5TYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksCjEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOmIuRWUoKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5EcShiKT8odGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBkYj1jLklsfHxkYjsoZnVuY3Rpb24oYyl7Yy5LbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LEdyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmhtLkpuLkhuP3dpbmRvdy5PTy5obS5Kbi5Ibi5VdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5XYT0xNTAwO3ZhciBiPQpkYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS55ZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgY2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IGRiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBlYj1jLktsfHxlYixmYj1uZXcgZWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzhdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLlR1PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsyXX1jLmd1PWI7Yi5wcm90b3R5cGU9e09sOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QbDp0aGlzLmtxKGEpfSwKa3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxxOnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5UdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGdiPWMuZ3V8fGdiLE1jPW5ldyBnYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLk9sKDQpOyhmdW5jdGlvbihjKXtjLllpPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMubmE9ITE7dGhpcy5PZygpfSxPZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2coKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE5hOmZ1bmN0aW9uKCl7dGhpcy56aCgpfSwKemg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemgoKX0uYmluZCh0aGlzKSwxMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBoYj1jLllpfHxoYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxoZzpmdW5jdGlvbihiKXt2YXIgYT1iLmNvZGUsYz1iLm1lc3NhZ2U7Yi5kYXRhJiYoYT1iLmRhdGEuY29kZSxjPWIuZGF0YS5tZXNzYWdlKTsxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnJhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5oZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBpYj1jLlhpfHxpYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LENoOmZ1bmN0aW9uKGIpe2I9bmV3IGhiKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5EZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksCnRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuaHF8fCh0aGlzLmhxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5DaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuQ2god2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBqYj1jLlppfHxqYixUPW5ldyBqYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KdD0KdGhpcy5hWzEwXTt0aGlzLlpwPXRoaXMuYVsxMF07dGhpcy5aaj10aGlzLmFbNF07dGhpcy5Tcz10aGlzLmFbMl07dGhpcy5ndD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLkRqPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnA6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpqOnRoaXMuUnMoYSl9LFJzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tczp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYj1jLkRqfHxrYixOYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TmMuSXQoNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5XKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSwKTWM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLkxtfHxVOyhmdW5jdGlvbihjKXtjLkttPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guWWMoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LlljKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTnMoYSl9LmJpbmQodGhpcykpO3guWWMoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eC5ZYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsCmZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt4LlBxKCl9LE5zOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMucmEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLkttfHxWOyhmdW5jdGlvbihjKXtjLk1tPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPQpbXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy53ZCYmKGI9ZS55cChiLHRoaXMud2QpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLndkfHwodGhpcy53ZD1bXSksdGhpcy53ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksCnRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5UKCl9LFljOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmRhfHwodGhpcy5kYT17fSk7dGhpcy5kYVtiXXx8KHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LGd2OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuSWN8fCh0aGlzLkljPVtdKSx0aGlzLkljLnB1c2goYiksdGhpcy5hdSgpJiYodGhpcy5jZigpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSwKUHE6ZnVuY3Rpb24oKXtpZih0aGlzLkljKWZvcih2YXIgYj0wO2I8dGhpcy5JYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkljW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmRhW2NdW2RdW2VdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeC5ndihiKX19KX0pKGMpO3ZhciBsYj1jLk1tfHxsYix4PW5ldyBsYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Ncz10aGlzLmFbNV07dGhpcy5Vaj10aGlzLmFbMl07dGhpcy5Saz10aGlzLmFbMl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy54cj10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbNl07dGhpcy5xbj10aGlzLmFbN107dGhpcy5sbz10aGlzLmFbMl07dGhpcy5IbD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5xcj1iO2IucHJvdG90eXBlPXtMczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXM6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVqOnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sazp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmpvOnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHI6dGhpcy5DayhhKX0sQ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnFuOnRoaXMua28oYSl9LGtvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sbzp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYj1jLnFyfHxtYixPYz1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1PYy5Mcyg0KTsoZnVuY3Rpb24oYyl7Yy5VaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxBYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG5iPWMuVWl8fG5iOyhmdW5jdGlvbihjKXtjLlZpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMudSgibm9BZCIsInBsYXllZCIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgibm9BZCIsInBsYXllZCIpO3RoaXMuRyghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBvYj1jLlZpfHwKb2I7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBuYihkKTt0aGlzLk4oZyl8fCh0aGlzLlIoZyksKG5ldyBvYihnLHRoaXMuSSkpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlQoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLk1hKWlmKGE9PXRoaXMuTWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLk1hW2IubGEoKV0/ITA6ITF9fSl9KShjKTt2YXIgcGI9Yy5XaXx8cGIscWI9bmV3IHBiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVsPXRoaXMuYVs5XTt0aGlzLkFvPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsyXTt0aGlzLld1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLk5pPXRoaXMuYVszXTt0aGlzLkprPXRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzldfWMuTm09YjtiLnByb3RvdHlwZT17dGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnVsOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbzp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc3Q6dGhpcy5WdShhKX0sVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLld1OnRoaXMua3QoYSl9LAprdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubHQ6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5OaTp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSms6dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuTm18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnRsKDQpOyhmdW5jdGlvbihjKXtjLndsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYKKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuVyhiKTt0aGlzLlooYSk7dGhpcy5RdCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJgphLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmphJiZ0aGlzLmphLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLm11dGUmJnRoaXMuamEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxZZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLndsfHxzYjsoZnVuY3Rpb24oYyl7Yy52bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubmk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmCiF0aGlzLm5pJiYodGhpcy5HKCksdGhpcy5uaT0hMCx0aGlzLm9hKCkpO2EuS2EoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIHRiPWMudmx8fHRiOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMueGx8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy53aj10aGlzLmFbMV07dGhpcy5qaz10aGlzLmFbMl07dGhpcy5zbD10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs1XX1jLlNtPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2o6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmprOnRoaXMucmwoYSl9LHJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHZiPWMuU218fHZiLFFjPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmdqKDQpOwooZnVuY3Rpb24oYyl7Yy53bj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LApOYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciB3Yj1jLndufHx3YjsoZnVuY3Rpb24oYyl7Yy52bj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxZYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sT3Q6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmZifHwodGhpcy5mYj0KW10pO3RoaXMuZmIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnJhKCk6dGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudWM9ITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmdldFBsYXllcigpO3RoaXMuQ2E/dGhpcy5PdCh0aGlzLkNhKToodGhpcy5DYT10aGlzLlliKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQ2Epe3RoaXMuRygpOwpyZXR1cm59aWYoIXRoaXMudWMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuZmImJnRoaXMuZmIubGVuZ3RoJiYxPHRoaXMuZmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5mYi5sZW5ndGgtMTthKyspMTAwOSE9dGhpcy5mYlthXSYmMzAzIT10aGlzLmZiW2FdJiY0MDMhPXRoaXMuZmJbYV0mJihiPSExKTtpZihiKXRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCk7ZWxzZXt0aGlzLkcoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB4Yj1jLnZufHx4YjsoZnVuY3Rpb24oYyl7Yy54bj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7CnRoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHhiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB5Yj1jLnhufHx5Yix6Yj1uZXcgeWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG09dGhpcy5hWzZdO3RoaXMuS3M9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy54aj1iO2IucHJvdG90eXBlPXtDbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkRtOnRoaXMuSnMoYSl9LEpzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lczp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy54anx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLkNtKDQpOyhmdW5jdGlvbihjKXtjLndtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5XKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlhlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy52dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlhlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlhlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LE11OmZ1bmN0aW9uKCl7dGhpcy5YZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMud218fEJiOyhmdW5jdGlvbihjKXtjLnZtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ycz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5ycz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuTXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIENiPWMudm18fENiOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMueG18fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbMl07dGhpcy51bT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmlqPWI7Yi5wcm90b3R5cGU9e0RvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbzp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLmlqfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuRG8oNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5XKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5wbXx8R2I7KGZ1bmN0aW9uKGMpe2Mub209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuS2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLm9kKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5acigpOnRoaXMuamcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuU2YoKXx8dGhpcy5tKCEwKX0sWnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9kKCk7IWIucWEmJmIuWSYmYi5UdyYmYi5WdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxqZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMub2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpnKCl9LmJpbmQodGhpcyksMTAwKX0sb2Q6ZnVuY3Rpb24oKXtpZighdGhpcy51aClmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuS2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMudWg9YltjXSk7cmV0dXJuIHRoaXMudWh9LApueDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5vZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLm9tfHxIYjsoZnVuY3Rpb24oYyl7Yy5xbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMucW18fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMTBdO3RoaXMueHQ9dGhpcy5hWzNdO3RoaXMuc2o9dGhpcy5hWzldO3RoaXMud3A9dGhpcy5hWzldO3RoaXMuQmw9dGhpcy5hWzddO3RoaXMuRm09dGhpcy5hWzZdO3RoaXMuUHA9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbOV19Yy53bz1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnh0OnRoaXMucmooYSl9LHJqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zajp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLndwOnRoaXMuQWwoYSl9LEFsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbDp0aGlzLkVtKGEpfSxFbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRm06dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgS2I9Yy53b3x8S2IsVGM9bmV3IEtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuV3AoNCk7KGZ1bmN0aW9uKGMpe2MubGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0gmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sbHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLiRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEgpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sS2E6ZnVuY3Rpb24oKXt2YXIgYjtIPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPWMubGx8fFg7KGZ1bmN0aW9uKGMpe2Mua2w9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuWWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5ZZT1iLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj0KYS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5ZZSYmYiE9dGhpcy5ZZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLmZhKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS50eCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMudSgiYWRlcnJvciIpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMua2x8fFk7KGZ1bmN0aW9uKGMpe2MubWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiYKd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0g9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihIKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFgoYiksYi5uYT90aGlzLmNmKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMubWx8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpsPXRoaXMuYVs1XTt0aGlzLm9yPXRoaXMuYVsxXTt0aGlzLkxqPXRoaXMuYVsxMF07dGhpcy5lbz10aGlzLmFbOV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5qdj10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbM107dGhpcy5Hbj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs0XX1jLnJyPWI7Yi5wcm90b3R5cGU9e3lsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3I6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Majp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZW86dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkFpOnRoaXMuaXYoYSl9LGl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuanY6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLnJyfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy55bCg0KTsoZnVuY3Rpb24oYyl7Yy5naz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApodTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0scXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5na3x8T2I7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5ma3x8UGI7KGZ1bmN0aW9uKGMpe2MuaGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yaztifHwoYj13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTsKaWYoYiYmYi5HZXRBbGxQbGF5ZXJzJiYoYj1iLkdldEFsbFBsYXllcnMoKSkmJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm5hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5oa3x8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs2XX1jLmF0PWI7Yi5wcm90b3R5cGU9e1ZzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Xczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFNiPWMuYXR8fFNiLFZjPW5ldyBTYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5Wcyg0KTsoZnVuY3Rpb24oYyl7Yy5Cbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSxOZDpmdW5jdGlvbihiKXt2YXIgYT0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9hPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6e319KTooYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxhLmluaXRDdXN0b21FdmVudChiLCExLCExLGRhdGEpKTthJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChhKX0sClB0OmZ1bmN0aW9uKCl7dGhpcy5SYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwmJiJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJjfHwodGhpcy5SYz0hMCx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYSl7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuTmQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlJjJiYodGhpcy5OZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlJjPSExKSx0aGlzLk5kKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksCiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuQm58fFRiOyhmdW5jdGlvbihjKXtjLkFuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LERoOmZ1bmN0aW9uKCl7dmFyIGI9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjtiPyhiJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VYihhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSksCmImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLlViKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5EaC5iaW5kKHRoaXMpLDEwKX0sVWI6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LE9mOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLlViKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pOwp0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuT2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5EaCgpO3RoaXMuT2YoKTt0aGlzLlN0KCl9LFN0OmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYil7dGhpcy5VYihiKX0pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGIpe3RoaXMuTnQ9ITA7aWYoYiYmYi5kZXRhaWwpZm9yKHZhciBhIGluIGIuZGV0YWlsKSJhZFRhZ1VybCI9PWEmJihiLmRldGFpbFthXXx8dGhpcy5VYihiKSl9fSl9KShjKTt2YXIgVWI9Yy5Bbnx8VWI7CihmdW5jdGlvbihjKXtjLkNuPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IFRiKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGIuUHQoKSxiPW5ldyBVYihiLHRoaXMuSSksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1iLmdvLmJpbmQoYikpLGIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBWYj1jLkNufHxWYixXYj1uZXcgVmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJrPXRoaXMuYVsxMF07dGhpcy55aT10aGlzLmFbNF07dGhpcy5SbT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsyXX1jLiRqPWI7Yi5wcm90b3R5cGU9e0FrOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuQms6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5SbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuJGp8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkFrKDQpOyhmdW5jdGlvbihjKXtjLiRtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMueGg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlcoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuRHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LGh1OmZ1bmN0aW9uKCl7fSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Ec30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5MZChiKX0uYmluZCh0aGlzKSl9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLnhoJiYodGhpcy54aD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBPPWMuJG18fE87KGZ1bmN0aW9uKGMpe2MuWm09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy51ZSlpZih0aGlzLkRifHwodGhpcy5EYj0wKSx0aGlzLkRiKyssMTU8dGhpcy5EYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy50dSgpOnRoaXMubSghMCksITA7dGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMudWU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnUoImFkZXJyb3IiLGEpKTpiLnUoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMuWm18fFA7KGZ1bmN0aW9uKGMpe2MuYW49dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5uYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZygpKSk7dGhpcy5jZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMuYW58fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5PcT10aGlzLmFbMl07dGhpcy5SaT10aGlzLmFbM107dGhpcy5mbD10aGlzLmFbMV07dGhpcy5rcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVszXX1jLm5sPWI7Yi5wcm90b3R5cGU9e05xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcTp0aGlzLlFpKGEpfSxRaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmk6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5rcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5ubHx8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuTnEoNCk7KGZ1bmN0aW9uKGMpe2MuWWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlcoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTsKdmFyIFo9Yy5Za3x8WjsoZnVuY3Rpb24oYyl7Yy5Yaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5VZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkZjPXRoaXMuQ2E9dGhpcy4kYz0hMTt0aGlzLkJoPWUuSGIoMTApO3RoaXMuZGgoKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnJiKCksITA7dGhpcy5VZysrO2lmKDEwPHRoaXMuVWcpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGguYmluZCh0aGlzKSwxMDApLCExfSxyYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLlhrfHxhYTsoZnVuY3Rpb24oYyl7Yy5aaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmCihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLlprfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZGo9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtjajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLk9zfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5jaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlcoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5ia3x8ZGM7KGZ1bmN0aW9uKGMpe2MuYWs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuaWcoKX0saWc6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgZWM9Yy5ha3x8ZWM7KGZ1bmN0aW9uKGMpe2MuY2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm5hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5nKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLmNrfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmw9dGhpcy5hWzVdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuWHE9CnRoaXMuYVsxXTt0aGlzLllzPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs0XTt0aGlzLnRzPXRoaXMuYVsxXTt0aGlzLkVuPXRoaXMuYVsxMF07dGhpcy5HdD10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbNV07dGhpcy56cz10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs3XX1jLnR2PWI7Yi5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibDp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuemo6dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhxOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zczp0aGlzLkdrKGEpfSxHazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSGs6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnRzOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Fbjp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLkd0OnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5KbTp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuenM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLnR2fHxoYyxaYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5hbCg0KTsoZnVuY3Rpb24oYyl7Yy5yaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGljPWMucml8fGljOyhmdW5jdGlvbihjKXtjLnBpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubWUoKTt0aGlzLmZnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmCi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LApFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGZnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPWIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIoKSkmJmIuYWRzTG9hZGVyKWZvcih2YXIgYT0wO2E8Yi5hZHNMb2FkZXIubGVuZ3RoO2ErKyl7dmFyIGM9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwOwppZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJigxMDA5PT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSkpe2I9ITA7YnJlYWt9fWI/KHRoaXMudygpLHRoaXMucmEoKSk6dGhpcy5tKCl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5mZy5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWUuYmluZCh0aGlzKSwxMDApfSxtZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJgpiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5tZS5iaW5kKHRoaXMpLDEwMCl9fSxtOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxRTQpO3RoaXMuRyhiKX19KX0pKGMpO3ZhciBqYz1jLnBpfHxqYzsoZnVuY3Rpb24oYyl7Yy5zaT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFRhOmZ1bmN0aW9uKGIpe2I9bmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD8KdGhpcy5UYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBrYz1jLnNpfHxrYyxsYz1uZXcga2Mocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYmo9dGhpcy5hWzddO3RoaXMuQ3Y9dGhpcy5hWzldO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMuRmo9dGhpcy5hWzEwXTt0aGlzLnd3PXRoaXMuYVs1XTt0aGlzLmhvPXRoaXMuYVs5XTt0aGlzLnVuPXRoaXMuYVs0XTt0aGlzLkhtPXRoaXMuYVszXTt0aGlzLlBpPXRoaXMuYVs0XTt0aGlzLmxtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzddfWMuQXM9YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJqOnRoaXMuQnYoYSl9LEJ2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnl1Ogp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy52dyhhKX0sdnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnd3OnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudW46dGhpcy5HbShhKX0sR206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IbTp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5Bc3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuYWooNCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmZoPXRoaXMuaGg9dGhpcy5naD0hMTt0aGlzLnpkPVtdO3RoaXMuYmY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdjP251bGw6Z2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBXYj9udWxsOldiLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBSYj9udWxsOlJiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBxYj9udWxsOnFiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuZm09YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5FcShhKTpbXSxiO3RoaXMuaGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLAp0aGlzLkpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5iZil7aWYodGhpcy5maClicmVhaztiPXRoaXMuYmZbY107dGhpcy54ZihiKSYmKHRoaXMuemQucHVzaChiKSx0aGlzLkpoKGIpKX19LHhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sRXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuYmZbY10sdGhpcy54ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxKaDpmdW5jdGlvbihhKXt0aGlzLnhmKGEpJiZhLmcoKX0sT3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdoKWZvcih0aGlzLmZoPSEwLGE9MDthPHRoaXMuemQubGVuZ3RoO2ErKyl0aGlzLnpkW2FdLkxiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemRbYV0uTGIpfX19KShjKTt2YXIgbmM9Yy5mbXx8bmMsTT1uZXcgbmM7TS5nKCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs5XTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLlVsPXRoaXMuYVs2XTt0aGlzLllyPXRoaXMuYVs3XTt0aGlzLlVxPXRoaXMuYVs2XTt0aGlzLkx0PXRoaXMuYVs1XTt0aGlzLlhsPXRoaXMuYVs0XTt0aGlzLkdpPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLmpxPWI7Yi5wcm90b3R5cGU9e3lrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56azp0aGlzLnVvKGEpfSx1bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudm86dGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlVsOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Zcjp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5MdDp0aGlzLldsKGEpfSxXbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhsOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMuanF8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLnlrKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoKIiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5DYyhrLkV2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5DYyhrLkhzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ri53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIGJkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9Ri5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRik7dmFyIEk9bmV3IEosbD0hMTtJLmthKCk7CkkuWmcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmthKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5aZygpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0kua2EoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLnpnKHdpbmRvdyxJLnRyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbMTBdO3RoaXMuc209dGhpcy5hWzEwXTt0aGlzLlVzPXRoaXMuYVsxXTt0aGlzLmduPXRoaXMuYVsxMF07dGhpcy5CbT10aGlzLmFbOF07dGhpcy5zdz10aGlzLmFbN107dGhpcy5ldT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVszXX1jLlFvPWI7Yi5wcm90b3R5cGU9e3RrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51azp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNtOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vczp0aGlzLmZuKGEpfSxmbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ246dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJtOnRoaXMucncoYSl9LHJ3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdzp0aGlzLmR1KGEpfSxkdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBwYz1jLlFvfHxwYyxkZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1kZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueWg9dGhpcy5jb25mPXRoaXMubmI9dGhpcy5wbGF5ZXI9Cm51bGw7dGhpcy51ZD0wO3RoaXMuZWI9IiI7dGhpcy5BZD1bXTt0aGlzLkJkPTA7dGhpcy5BaD0hMTt0aGlzLlplPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnZpPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3RoaXMueWg9YX0saGY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmViPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxrdTpmdW5jdGlvbihhKXt0aGlzLm5iPWF9LGp1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZWJdJiZ0aGlzLmNvbmZbdGhpcy5lYl1bYV0mJihiPXRoaXMuY29uZlt0aGlzLmViXVthXSk7cmV0dXJuIGJ9LE5jOmZ1bmN0aW9uKGEsYil7ZS5mYSgid2VsdC5kZSIpJiZlLmJiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLnlyKCkpdGhpcy5uYi5sKHRoaXMubmIucWQsdGhpcy5uYi53YSx0aGlzLm5iLmFmLGZ1bmN0aW9uKCl7dGhpcy5OYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMubmIuQmMpO2Vsc2UgaWYodGhpcy5ScSgpKXRoaXMuZnUoZnVuY3Rpb24oKXt0aGlzLk5jKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay56Yyx0aGlzLnBsYXllci5zKCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyAkYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuUXUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7ClI9bD1uZXcgUmEobCx0aGlzLm5iLGcpO2wuaXUodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnFzKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSmUmJihjPXRoaXMucGxheWVyLkplKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkxlKGEsYyxmKTt0aGlzLnBsYXllci5MaChsKX19LHlyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy51ZC5nZXRUaW1lKCksdGhpcy51ZD1hLDNFNTxiPyEwOiExO3RoaXMudWQ9YTtyZXR1cm4hMX0sRXU6ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7CmUuZ2YoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy52ZyhhKSk/dGhpcy5OYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfSxEdTpmdW5jdGlvbihhKXtpZighdGhpcy55aCl7ZS5nZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMucHUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMudmcoYykpP3RoaXMuTmMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLAohMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmZkLHRoaXMucGxheWVyLnMoKSkpfX0sdmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LFZ0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIudnUodGhpcy5EdS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfSxGZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS5nZigibWlkcm9sbCIpO2lmKCF0aGlzLm5oKXt0aGlzLm5oPSEwO3ZhciBiPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLk5jKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5oPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksCnRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5mZCx0aGlzLnBsYXllci5zKCkpKX19LFV0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIub3UodGhpcy5GZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5PZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5FdSgpO3RoaXMucGxheWVyLk9lJiZ0aGlzLlV0KCk7dGhpcy5WdCgpfSxXdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkFkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5pdyhhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQmQ9dGhpcy5BZC5sZW5ndGh9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9CiExOzA8dGhpcy5CZCYmKGE9ITApO3JldHVybiBhfSxmdTpmdW5jdGlvbihhKXt0aGlzLkFoPWE7Zm9yKGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRHQuYmluZCh0aGlzKSl9LER0OmZ1bmN0aW9uKGEpe3RoaXMuQmQtLTthJiZ0aGlzLlplLnB1c2goYSk7MD49dGhpcy5CZCYmdGhpcy5BaCgpfSxxczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5aZS5sZW5ndGg7YysrKWI9dGhpcy5aZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZmE9Yy52aXx8ZmEsUj0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcz10aGlzLmFbMV07dGhpcy5VbT10aGlzLmFbMV07dGhpcy51aT10aGlzLmFbNl07dGhpcy4kcz10aGlzLmFbM107dGhpcy5zbj10aGlzLmFbOF07CnRoaXMuZWs9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbM119Yy56bj1iO2IucHJvdG90eXBlPXtCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51aTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuJHM6dGhpcy5ybihhKX0scm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnNuOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuem58fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWVkLkJzKDQpfSkuY2FsbChLdXRhZWNoZWRpZVBvWWFpLApLdXRhZWNoZWRpZVBvWWFpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.244.75
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.75.244.243.136.clients.your-server.de
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
|
GET
H2
|
200
|
pd
eu-u.openx.net/w/1.0/
Frame 480E
|
0
0
|
16ms
16ms
|
Document
text/html |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.163.0 /
- Resource Hash
|
GET
H2
|
200
|
index.html
cdn.districtm.io/ids/
Frame B562
|
0
0
|
103ms
101ms
|
Document
text/html |
104.16.68.69
Cloudflare
|
|
General
- Full URL
- https://cdn.districtm.io/ids/index.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.68.69
, United States,
ASN13335
(CLOUDFLARENET - Cloudflare, Inc., US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame 7AF2
|
0
0
|
23ms
6ms
|
Document
text/html |
2.18.232.130
Akamai Technologies
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.130
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-130.deploy.static.akamaitechnologies.com
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame 1A2B
|
0
0
|
21ms
6ms
|
Document
text/html |
2.18.232.130
Akamai Technologies
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.130
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-130.deploy.static.akamaitechnologies.com
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
Cookie set
showad.js
ads.pubmatic.com/AdServer/js/
Frame 3455
|
0
0
|
9ms
9ms
|
Document
text/html |
2.18.233.180
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
data
lb33.s400.meetrics.net/
|
43 B
308 B
|
3ms
1ms
|
Image
image/gif |
136.243.33.84
HETZNER-AS
|
|
General
- Full URL
- https://lb33.s400.meetrics.net/data?/bHXvHJOBALl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A3xA11A50AxwAyyAwvEm2B32FqwB5kFjBFUkzFFCPeCAAAAAAABmkiAPAAAFAAmkiTTfPAPBAAmUA5BABTfPAZAAAOA55A55A85B55A58E55A55AGAx0Ax2Aw2ArTfPAPZDAAZAwSAcAAAAPAAAmUA5BAHTfPAPAAAJPA2GAHbosASksFDFjAAAAAAAAAAAAEAAAmkiAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4E2wAwBEMAxzA4yA44A2wAy4AyyAGAkpFylFj0FAAAAIAy4A1zA41A31AKA1xA4yA4yAzyA05ADAzrF5BFKA1xA4yA4yAzyA05AKA1xA4yA4yAzyA05AtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdmUA5BAsEAYJAFAAATfPAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFCZz7SA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.33.84
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h381.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame 9F65
|
0
0
|
15ms
15ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V75qoCFgOO_YdP4KmPWQSO_YdP4KmPWQUAAAAGBvQHHLiZMCYLFm1CXCxHu8FqNNjtdpPZZjcbrqYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ9Q-_WTE__YiRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDQht7jyJqlOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugIWjEYrM4gJpvRbjI7AAAAgLv___9_PRBZziYj58bmXI4szo1r45mtJpbVyuUZWTY2i8vkPU-8-1khsm-fvhFhmf2-g4JyenrMLoOM5TIZ1AJZ0-TyG8QHDcNyMgjmN2GL0Woy2SyHs-ViMhiOhqPR_gRuNMAJGg4Hi91gsVsshpPFZDRYDhYoEIMJTshwtJmsRrvVbrIcTkaj2WayQYpWrWajzWC4mk1mu91qOBguRyOkaM1iNpksZqPlbjNYTkaD4WQ4RJhcDBe24XC01q1MvrVoMFm5lbvVYq1yrSYWi2s2nHiMa9HrYzotXMuRb7NFwQClvQgu0onmdPm7XJa35m1x65w-h0Us0Zws0onssq8sZ5ORc2NzLkcW58a18cxWE8tq5fKMLBubxWXyNxfDhW04HK11K5NvLRpMVm7lbrVYq1yricXimg0nHuNa9PqYTgvXcuTb7Bur3WK1Wo4Wi31jtVusVsvRYrHv0Bm-q8_ZqLxpFR6TV3Fujiwzp0HhMli8P4lpMe3ODp7f7-hUqS4aY0P2TSjMBo_BoIglgtNFOhG9jKeLWCJ5WqQTjWUwWc5cw8Vst5p5djPfyDNyeJwbw2Lk8C08holYojRdpBO97mVxGA6fv-DhPDzMftHTcPj8BQ_n4WF2i_0-p92t-bt1LqPp81bdTW7N3y32uzynt9JoeYv9PqfdLbj8LWaX22VR_7EhRqO5bjZXDJZzzWCVAAAAAAAAAACWMGfeBAAAAOA0kMViMFksFwBCjHWX4FMq5NEJ_K248WOIOV3-LpflrXlb3Dqnz2FlAImdAg!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
308 B
|
138ms
138ms
|
Image
image/gif |
104.244.37.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=e71f43df-b5db-e2c1-5115-cd2e2be34d22&tv={c:rzDGyS,pingTime:5,time:5031,type:p,clog:[{piv:100,vs:i,r:,w:800,h:250,t:19}],es:0,sc:1,ha:1,gm:0,slTimes:{i:5031,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:19,wc:0.0.1600.1200,ac:393.121.800.250,am:i,cc:393.121.800.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[5026~100],as:[5026~800.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:139,fm:rFqv8h5+11|12|1311|1312|1313|1314|14|151|1611|17|18|19|1a|1b|1c|1d|1e|1f|1g|1h|1i*.346702-39754026|1n.331316-39077540,idMap:1i*,rend:0,renddet:WINDOW,rmeas:0}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.37.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- daldt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
308 B
|
138ms
138ms
|
Image
image/gif |
104.244.37.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=331316&asId=9c19bb53-d197-2bdf-f646-12fc7e91b354&tv={c:rzDGIf,pingTime:5,time:5035,type:p,clog:[{piv:94,vs:i,r:,w:300,h:600,t:18}],es:0,sc:1,ha:1,gm:1,slTimes:{i:5035,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1318.121.300.600,am:i,cc:1318.121.300.600,piv:94,obst:0,th:0,reas:,bkn:{piv:[5031~75],as:[5031~300.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:142,fm:rFqv8h5+11|12|1311|1312|1313|1314|14|151|1611|17|18|19|1a|1b|1c|1d|1e|1f|1g|1h|1i.346702-39754026|1i1|1j|1k|1l1|1l2|1m|1n*.331316-39077540,idMap:1n*,rend:1,renddet:IMG.qs,rmeas:1}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.37.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- daldt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame 8B6F
|
0
0
|
15ms
15ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V75qoCFgOO_YdP4KmPWQSO_YdP4KmPWQUAAAAGBvQHHLiZMCYLFm1CXCxHu8FqNNjtdpPZZjcbrqYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ9Q-_WTE__YiRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDQht7jyJqlOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugIWjEYrM4gJpvRbjI7AAAAgLv___9_PRBZziYj58bmXI4szo1r45mtJpbVyuUZWTY2i8vkPU-8-1khsm-fvhFhmf2-g4JyenrMLoOM5TIZ1AJZ0-TyG8QHDcNyMgjmN2GL0Woy2SyHs-ViMhiOhqPR_gRuNMAJGg4Hi91gsVsshpPFZDRYDhYoEIMJTshwtJmsRrvVbrIcTkaj2WayQYpWrWajzWC4mk1mu91qOBguRyOkaM1iNpksZqPlbjNYTkaD4WQ4RJhcDBe24XC01q1MvrVoMFm5lbvVYq1yrSYWi2s2nHiMa9HrYzotXMuRb7NFwQClvQgu0onmdPm7XJa35m1x65w-h0Us0Zws0onssq8sZ5ORc2NzLkcW58a18cxWE8tq5fKMLBubxWXyNxfDhW04HK11K5NvLRpMVm7lbrVYq1yricXimg0nHuNa9PqYTgvXcuTb7Bur3WK1Wo4Wi31jtVusVsvRYrHv0Bm-q8_ZqLxpFR6TV3Fujiwzp0HhMli8P4lpMe3ODp7f7-hUqS4aY0P2TSjMBo_BoIglgtNFOhG9jKeLWCJ5WqQTjWUwWc5cw8Vst5p5djPfyDNyeJwbw2Lk8C08holYojRdpBO97mVxGA6fv-DhPDzMftHTcPj8BQ_n4WF2i_0-p92t-bt1LqPp81bdTW7N3y32uzynt9JoeYv9PqfdLbj8LWaX22VR_7EhRqO5bjZXDJZzzWCVAAAAAAAAAACWMGfeBAAAAOA0kMViMFksFwBCjHWX4FMq5NEJ_K248WOIOV3-LpflrXlb3Dqnz2FlAImdAg!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame 1649
|
0
0
|
16ms
15ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V75qoCFgOO_YdP4KmPWQSO_YdP4KmPWQUAAAAGBvQHHLiZMCYLFm1CXCxHu8FqNNjtdpPZZjcbrqYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ9Q-_WTE__YiRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDQht7jyJqlOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugIWjEYrM4gJpvRbjI7AAAAgLv___9_PRBZziYj58bmXI4szo1r45mtJpbVyuUZWTY2i8vkPU-8-1khsm-fvhFhmf2-g4JyenrMLoOM5TIZ1AJZ0-TyG8QHDcNyMgjmN2GL0Woy2SyHs-ViMhiOhqPR_gRuNMAJGg4Hi91gsVsshpPFZDRYDhYoEIMJTshwtJmsRrvVbrIcTkaj2WayQYpWrWajzWC4mk1mu91qOBguRyOkaM1iNpksZqPlbjNYTkaD4WQ4RJhcDBe24XC01q1MvrVoMFm5lbvVYq1yrSYWi2s2nHiMa9HrYzotXMuRb7NFwQClvQgu0onmdPm7XJa35m1x65w-h0Us0Zws0onssq8sZ5ORc2NzLkcW58a18cxWE8tq5fKMLBubxWXyNxfDhW04HK11K5NvLRpMVm7lbrVYq1yricXimg0nHuNa9PqYTgvXcuTb7Bur3WK1Wo4Wi31jtVusVsvRYrHv0Bm-q8_ZqLxpFR6TV3Fujiwzp0HhMli8P4lpMe3ODp7f7-hUqS4aY0P2TSjMBo_BoIglgtNFOhG9jKeLWCJ5WqQTjWUwWc5cw8Vst5p5djPfyDNyeJwbw2Lk8C08holYojRdpBO97mVxGA6fv-DhPDzMftHTcPj8BQ_n4WF2i_0-p92t-bt1LqPp81bdTW7N3y32uzynt9JoeYv9PqfdLbj8LWaX22VR_7EhRqO5bjZXDJZzzWCVAAAAAAAAAACWMGfeBAAAAOA0kMViMFksFwBCjHWX4FMq5NEJ_K248WOIOV3-LpflrXlb3Dqnz2FlAImdAg!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
9ms
9ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
dc_oe=ChMIiY70g7Oq5QIVQyzgCh3Dcwe1EAAYACDWwpk6;met=1;×tamp=1571559422072;eid1=871060;ecn1=1;etm1=0;eid2=2;ecn2=1;etm2=10;
ade.googlesyndication.com/ddm/activity/
Frame 67BD
|
42 B
597 B
|
138ms
118ms
|
Image
image/gif |
216.58.207.34
Google LLC
|
|
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame 97BE
|
0
0
|
15ms
15ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V75qoCFgOO_YdP4KmPWQSO_YdP4KmPWQUAAAAGBvQHHLiZMCYLFm1CXCxHu8FqNNjtdpPZZjcbrqYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ9Q-_WTE__YiRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDQht7jyJqlOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugIWjEYrM4gJpvRbjI7AAAAgLv___9_PRBZziYj58bmXI4szo1r45mtJpbVyuUZWTY2i8vkPU-8-1khsm-fvhFhmf2-g4JyenrMLoOM5TIZ1AJZ0-TyG8QHDcNyMgjmN2GL0Woy2SyHs-ViMhiOhqPR_gRuNMAJGg4Hi91gsVsshpPFZDRYDhYoEIMJTshwtJmsRrvVbrIcTkaj2WayQYpWrWajzWC4mk1mu91qOBguRyOkaM1iNpksZqPlbjNYTkaD4WQ4RJhcDBe24XC01q1MvrVoMFm5lbvVYq1yrSYWi2s2nHiMa9HrYzotXMuRb7NFwQClvQgu0onmdPm7XJa35m1x65w-h0Us0Zws0onssq8sZ5ORc2NzLkcW58a18cxWE8tq5fKMLBubxWXyNxfDhW04HK11K5NvLRpMVm7lbrVYq1yricXimg0nHuNa9PqYTgvXcuTb7Bur3WK1Wo4Wi31jtVusVsvRYrHv0Bm-q8_ZqLxpFR6TV3Fujiwzp0HhMli8P4lpMe3ODp7f7-hUqS4aY0P2TSjMBo_BoIglgtNFOhG9jKeLWCJ5WqQTjWUwWc5cw8Vst5p5djPfyDNyeJwbw2Lk8C08holYojRdpBO97mVxGA6fv-DhPDzMftHTcPj8BQ_n4WF2i_0-p92t-bt1LqPp81bdTW7N3y32uzynt9JoeYv9PqfdLbj8LWaX22VR_7EhRqO5bjZXDJZzzWCVAAAAAAAAAACWMGfeBAAAAOA0kMViMFksFwBCjHWX4FMq5NEJ_K248WOIOV3-LpflrXlb3Dqnz2FlAImdAg!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame 1C25
|
0
0
|
17ms
16ms
|
Document
text/html |
151.101.14.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V75qoCFgOO_YdP4KmPWQSO_YdP4KmPWQUAAAAGBvQHHLiZMCYLFm1CXCxHu8FqNNjtdpPZZjcbrqYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQ9Q-_WTE__YiRAWJRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDQht7jyJqlOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugIWjEYrM4gJpvRbjI7AAAAgLv___9_PRBZziYj58bmXI4szo1r45mtJpbVyuUZWTY2i8vkPU-8-1khsm-fvhFhmf2-g4JyenrMLoOM5TIZ1AJZ0-TyG8QHDcNyMgjmN2GL0Woy2SyHs-ViMhiOhqPR_gRuNMAJGg4Hi91gsVsshpPFZDRYDhYoEIMJTshwtJmsRrvVbrIcTkaj2WayQYpWrWajzWC4mk1mu91qOBguRyOkaM1iNpksZqPlbjNYTkaD4WQ4RJhcDBe24XC01q1MvrVoMFm5lbvVYq1yrSYWi2s2nHiMa9HrYzotXMuRb7NFwQClvQgu0onmdPm7XJa35m1x65w-h0Us0Zws0onssq8sZ5ORc2NzLkcW58a18cxWE8tq5fKMLBubxWXyNxfDhW04HK11K5NvLRpMVm7lbrVYq1yricXimg0nHuNa9PqYTgvXcuTb7Bur3WK1Wo4Wi31jtVusVsvRYrHv0Bm-q8_ZqLxpFR6TV3Fujiwzp0HhMli8P4lpMe3ODp7f7-hUqS4aY0P2TSjMBo_BoIglgtNFOhG9jKeLWCJ5WqQTjWUwWc5cw8Vst5p5djPfyDNyeJwbw2Lk8C08holYojRdpBO97mVxGA6fv-DhPDzMftHTcPj8BQ_n4WF2i_0-p92t-bt1LqPp81bdTW7N3y32uzynt9JoeYv9PqfdLbj8LWaX22VR_7EhRqO5bjZXDJZzzWCVAAAAAAAAAACWMGfeBAAAAOA0kMViMFksFwBCjHWX4FMq5NEJ_K248WOIOV3-LpflrXlb3Dqnz2FlAImdAg!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/23_14_12/infra/cmTagFEED_MANAGER.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|