GET
H/1.1
|
200
OK
|
Primary Request
Cookie set
/
Show response
www.golem.de/
Redirect Chain
-
http://www.golem.de/
-
https://www.golem.de/
|
169 KB
170 KB
|
95ms
41ms
|
Document
text/html |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_114-min.css
www.golem.de/staticrl/styles/
|
73 KB
20 KB
|
62ms
23ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
iqd_gzip_test.js.gz
Show response
iqdtms.golem.de/
|
23 B
491 B
|
152ms
88ms
|
Script
application/x-gzip |
77.247.84.128
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
logo-g.png
www.golem.de/staticrl/images/
|
4 KB
4 KB
|
53ms
17ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135835-170320-170318_rc.jpg
www.golem.de/1808/
|
18 KB
19 KB
|
52ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135833-170317-170314_rc.jpg
www.golem.de/1808/
|
8 KB
9 KB
|
54ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135837-170329-170326_rc.jpg
www.golem.de/1808/
|
6 KB
6 KB
|
35ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135836-170325-170322_rc.jpg
www.golem.de/1808/
|
3 KB
3 KB
|
20ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135813-170228-170227_rc.jpg
www.golem.de/1808/
|
8 KB
9 KB
|
20ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
66ms
17ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
silvana-snap.jpg
video.golem.de/teaser/1/1/21550/thumb-high-1000/
|
87 KB
87 KB
|
64ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
capturecards-snap6.jpg
video.golem.de/teaser/1/1/21485/thumb-high-1000/
|
117 KB
117 KB
|
46ms
16ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
43ms
15ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135171-167202-167198_rc.jpg
www.golem.de/1806/
|
74 KB
75 KB
|
16ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135460-168609-168606_rc.jpg
www.golem.de/1807/
|
83 KB
84 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_114-min.js
Show response
www.golem.de/staticrl/scripts/
|
100 KB
41 KB
|
20ms
20ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
longread-swiper_117-min.js
Show response
www.golem.de/staticrl/scripts/
|
2 KB
1 KB
|
18ms
16ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
account_js_dt18_1_0.php
Show response
www.golem.de/abo/
|
88 B
474 B
|
35ms
17ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sdcv.js
Show response
ads.golem.de/
|
63 B
430 B
|
65ms
16ms
|
Script
application/javascript |
2a00:13c8:f5::f:4b3d:17a
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
26 KB
9 KB
|
31ms
9ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H/1.1
|
200
OK
|
iqadcontroller.js.gz
Show response
iqdtms.golem.de/cdn_golem_dt/live/
|
178 KB
46 KB
|
113ms
113ms
|
Script
text/javascript |
77.247.84.128
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
|
20 KB
8 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:825::2002
Google LLC
|
|
|
GET
S
|
200
|
imgad
Show response
tpc.googlesyndication.com/pagead/
|
25 B
191 B
|
9ms
7ms
|
Script
application/x-javascript |
2a00:1450:4001:81c::2001
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
yield.js
Show response
z.moatads.com/iqdigitaldfpprebidheader645711382528/
|
98 KB
30 KB
|
38ms
6ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
S
|
200
|
prebid15122017.js
Show response
dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/
|
87 KB
28 KB
|
49ms
9ms
|
Script
application/javascript |
2600:9000:2047:e00:1:9777:c740:21
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
default.js
Show response
ups.xplosion.de/loader/97578/
Redirect Chain
-
https://dyn.emetriq.de/loader/97578/default.js
-
https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
|
2 KB
2 KB
|
109ms
26ms
|
Script
text/javascript |
52.17.80.93
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
launch-EN92e1075482f3410d81944270acba8d90.min.js
Show response
assets.adobedtm.com/
|
111 KB
36 KB
|
28ms
11ms
|
Script
application/x-javascript |
2.18.232.23
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
adex.js
Show response
dmp.theadex.com/d/494/1428/s/
|
38 KB
14 KB
|
60ms
12ms
|
Script
application/javascript |
89.163.159.126
MYLOC-AS
|
|
|
GET
S
|
200
|
visclass.js
Show response
d1pywvbolq0b04.cloudfront.net/iqdvis/golem/
|
1 KB
832 B
|
47ms
10ms
|
Script
text/javascript |
2600:9000:2047:2400:1c:9fd1:6d00:21
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
26033,26034,26035,660053,660071,660107,660089,5108423,464839
Show response
ad.yieldlab.net/yp/
|
154 B
707 B
|
33ms
13ms
|
Script
text/javascript |
2.18.232.233
Akamai Technologies
|
|
General
- Full URL
- https://ad.yieldlab.net/yp/26033,26034,26035,660053,660071,660107,660089,5108423,464839?ts=1533407800351&yl_rtb_pubkey=21719_golem
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Server
-
2.18.232.233
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-233.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8
|
GET
H/1.1
|
200
OK
|
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
|
22 KB
22 KB
|
19ms
18ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
|
22 KB
22 KB
|
17ms
16ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
|
21 KB
21 KB
|
16ms
16ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
258 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
325 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
768 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
153 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
147 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
126 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif-Bold.woff2
www.golem.de/staticrl/fonts/droidserif/
|
26 KB
26 KB
|
17ms
16ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
|
20 KB
20 KB
|
20ms
19ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
28ms
28ms
|
Script
application/javascript |
2a00:1450:4001:81e::2002
Google LLC
|
|
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
27ms
27ms
|
Script
application/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
|
GET
S
|
200
|
pubads_impl_237.js
Show response
securepubads.g.doubleclick.net/gpt/
|
179 KB
62 KB
|
41ms
41ms
|
Script
text/javascript |
172.217.22.66
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
918034,918035,918036,918038,918037,918039,918040,5196623,918310
Show response
ad.yieldlab.net/yp/
|
154 B
707 B
|
23ms
21ms
|
Script
text/javascript |
2.18.232.233
Akamai Technologies
|
|
General
- Full URL
- https://ad.yieldlab.net/yp/918034,918035,918036,918038,918037,918039,918040,5196623,918310?ts=1533407800351&yl_rtb_pubkey=781119_golem
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Server
-
2.18.232.233
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-233.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8
|
GET
H/1.1
|
200
OK
|
id
Show response
dpm.demdex.net/
|
1 KB
1 KB
|
737ms
186ms
|
XHR
application/json |
35.165.133.163
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
yi.js
Show response
mb.moatads.com/
|
2 KB
2 KB
|
84ms
26ms
|
Script
text/html |
52.56.240.94
Amazon.com
|
|
General
- Full URL
- https://mb.moatads.com/yi.js?ud=false&ue=false&uu=false&qm=0&qn=(%2BIb%7Cj8o%3FJ(jkkeL07ta_*JRM!6t9B%2CN%3Ey)%2ChXbvU37_*NhSfBghz%5D*vOJ%23_%3DNoUA%5DRgBU_Gr1%3E%3AHuFTn%3ADXqJHZ%3BR%23yAb%2Bho8bYLaXBjA%3AmQ)%3CF!tAbjrzJ%3BgoVYGVxc%40lQQV%23tc3%2Fh%7C%3FVKV%3BW5.NO)Wx%7C*E%24%3D!L2ux%7Ci_lOfxECSR23_hFAkD%3Dv%3CN%5B.%22%24b_o%3FtVD%5D%5BpN%7CQF%40Sy7%7BA&qp=00000&qq=000000000000&qr=0&is=voqBBkBBBBHhBBBBBZkJjBRCqUCY3CTCB6BXwUcu8gKCBS9lYBBBCCBpYFmR4BOZBBgSJTcBBBBBBBBHUoKOFCyz7BB3CZ6mv5TimBBe9oeCt9lXqBvBCfBBBBBBBBBBBBBBCBMBaBeBBkKzQClBeaKaMVMBj5iMPzyHVY9zqxknZlysGxCBcBBBC9CctORpnICyRBBB4OBBBBBBBBBBC9TiFF3dOKBCBBxBBBBBBBfBz1BD7fB3BpkBJUDyDCS6IDDDCCCCDDCCCCCCCBdh2eBBBGI79kNB8DJoDBBBBCiBBiB&iv=6&gz=0&hh=0&hn=0&qt=0&tw=null&url=https%3A%2F%2Fwww.golem.de%2F&confidence=2&pcode=iqdigitaldfpprebidheader645711382528&callback=MoatNadoAllJsonpRequest_27277248
- Requested by
- Host: z.moatads.com
URL: https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yield.js
- Protocol
- HTTP/1.1
- Server
-
52.56.240.94
London, United Kingdom,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-56-240-94.eu-west-2.compute.amazonaws.com
- Software
-
nginx/1.7.9 /
- Resource Hash
- 984d6c047a051a122d2ad6f9a807c98ff8347921b053ab2062f2d56aba372ff8
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
26ms
5ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=17&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&na=398424009&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
jpt
Show response
ib.adnxs.com/
|
0
663 B
|
42ms
12ms
|
Script
text/html |
185.33.223.216
AppNexus
|
|
General
- Full URL
- https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=25776ec2ae4177&psa=0&member=6975&code=golem-homepage-iqadtile1&size=728x90&referrer=https%3A%2F%2Fwww.golem.de%2F
- Requested by
- Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
- Protocol
- HTTP/1.1
- Server
-
185.33.223.216
, European Union,
ASN29990
(ASN-APPNEXUS - AppNexus, Inc, US),
- Reverse DNS
- Software
-
nginx/1.13.4 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
jpt
Show response
ib.adnxs.com/
|
0
663 B
|
43ms
12ms
|
Script
text/html |
185.33.223.216
AppNexus
|
|
General
- Full URL
- https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=3631350dd86457&psa=0&member=6975&code=golem-homepage-iqadtile16&size=1000x333&promo_sizes=1000x167,1000x125,1000x100,970x250,800x250,970x90,728x90,660x250&referrer=https%3A%2F%2Fwww.golem.de%2F
- Requested by
- Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
- Protocol
- HTTP/1.1
- Server
-
185.33.223.216
, European Union,
ASN29990
(ASN-APPNEXUS - AppNexus, Inc, US),
- Reverse DNS
- Software
-
nginx/1.13.4 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
jpt
Show response
ib.adnxs.com/
|
0
663 B
|
45ms
14ms
|
Script
text/html |
185.33.223.216
AppNexus
|
|
General
- Full URL
- https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=43077ac32eb451&psa=0&member=6975&code=golem-homepage-iqadtile3&size=1000x333&promo_sizes=1000x250,1000x100,970x90,940x250,970x250,800x250&referrer=https%3A%2F%2Fwww.golem.de%2F
- Requested by
- Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
- Protocol
- HTTP/1.1
- Server
-
185.33.223.216
, European Union,
ASN29990
(ASN-APPNEXUS - AppNexus, Inc, US),
- Reverse DNS
- Software
-
nginx/1.13.4 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
jpt
Show response
ib.adnxs.com/
|
0
663 B
|
46ms
13ms
|
Script
text/html |
185.33.223.216
AppNexus
|
|
General
- Full URL
- https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=565f21f14be5d1&psa=0&member=6975&code=golem-homepage-iqadtile4&size=1000x500&promo_sizes=1000x333,1000x250,1000x167,1000x125,1000x100,970x90,800x250,970x250,970x90,800x250&referrer=https%3A%2F%2Fwww.golem.de%2F
- Requested by
- Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
- Protocol
- HTTP/1.1
- Server
-
185.33.223.216
, European Union,
ASN29990
(ASN-APPNEXUS - AppNexus, Inc, US),
- Reverse DNS
- Software
-
nginx/1.13.4 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
jpt
Show response
ib.adnxs.com/
|
0
663 B
|
47ms
14ms
|
Script
text/html |
185.33.223.216
AppNexus
|
|
General
- Full URL
- https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=6c5ca7b612c85&psa=0&member=6975&code=golem-homepage-iqadtile5&size=1000x500&promo_sizes=1000x333,1000x250,1000x167,1000x125,1000x100,970x90,800x250,970x250,970x90,800x250&referrer=https%3A%2F%2Fwww.golem.de%2F
- Requested by
- Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
- Protocol
- HTTP/1.1
- Server
-
185.33.223.216
, European Union,
ASN29990
(ASN-APPNEXUS - AppNexus, Inc, US),
- Reverse DNS
- Software
-
nginx/1.13.4 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
jpt
Show response
ib.adnxs.com/
|
0
663 B
|
48ms
15ms
|
Script
text/html |
185.33.223.216
AppNexus
|
|
General
- Full URL
- https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=771aa09e3cac05&psa=0&member=6975&code=golem-homepage-iqadtile8&size=300x300&promo_sizes=300x600,300x250&referrer=https%3A%2F%2Fwww.golem.de%2F
- Requested by
- Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
- Protocol
- HTTP/1.1
- Server
-
185.33.223.216
, European Union,
ASN29990
(ASN-APPNEXUS - AppNexus, Inc, US),
- Reverse DNS
- Software
-
nginx/1.13.4 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
jpt
Show response
ib.adnxs.com/
|
0
663 B
|
13ms
13ms
|
Script
text/html |
185.33.223.216
AppNexus
|
|
General
- Full URL
- https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=8046c139822d14&psa=0&member=6975&code=golem-homepage-iqadtile9&size=300x300&promo_sizes=300x600,300x250&referrer=https%3A%2F%2Fwww.golem.de%2F
- Requested by
- Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
- Protocol
- HTTP/1.1
- Server
-
185.33.223.216
, European Union,
ASN29990
(ASN-APPNEXUS - AppNexus, Inc, US),
- Reverse DNS
- Software
-
nginx/1.13.4 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
publishertag.js
Show response
static.criteo.net/js/ld/
|
76 KB
23 KB
|
56ms
14ms
|
Script
text/javascript |
178.250.2.130
ASN-CRITEO-EUROPE
|
|
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
7ms
4ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=0&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=0&zMoat_YI1=0&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1424699895&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
74 KB
27 KB
|
32ms
32ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
golem_csi-114-min.js
Show response
www.golem.de/staticrl/scripts/adsense/
|
3 KB
2 KB
|
18ms
18ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gx-ads.js
Show response
ads.golem.de/track.ads/
|
124 B
492 B
|
15ms
15ms
|
Script
application/javascript |
2a00:13c8:f5::f:4b3d:17a
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
btn-follow-sp4.png
www.golem.de/staticrl/images/
|
4 KB
4 KB
|
16ms
16ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
tx.io
Show response
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=0012374d13b51c4225b65f238&ep=1558392831&vr=409&id=s9k4qs<=1533...
-
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=0012374d13b51c4225b65f238&ep=1558392831&vr=409&id=s9k4qs<=1533...
|
0
694 B
|
10ms
9ms
|
Script
application/x-javascript |
91.215.100.40
INFONLINE-AS
|
|
General
- Full URL
- https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=0012374d13b51c4225b65f238&ep=1558392831&vr=409&id=s9k4qs<=1533407800676&ev=&cs=1jejua&mo=1&sr=71
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Server
-
91.215.100.40
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de4.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.04.6 0023
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
S
|
200
|
ga.js
Show response
www.google-analytics.com/
|
45 KB
17 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81c::200e
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
swiper-4.2.2.custom.min.js
Show response
www.golem.de/staticrl/scripts/external/
|
69 KB
23 KB
|
18ms
17ms
|
XHR
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_cpxl_113-min.js
Show response
www.golem.de/staticrl/scripts/
|
8 KB
4 KB
|
31ms
31ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
nms.jpg
video.golem.de/teaser/1/1/21537/thumb-high-1000/
|
134 KB
134 KB
|
16ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
pgi-snap.jpg
video.golem.de/teaser/1/1/21535/thumb-high-1000/
|
172 KB
173 KB
|
51ms
50ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
screenshot2018-08-02at09.41.19.jpg
video.golem.de/teaser/1/1/21548/thumb-high-1000/
|
61 KB
62 KB
|
50ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gran-turismo-sport-juli-update-trailer.jpg
video.golem.de/teaser/1/1/21547/thumb-high-1000/
|
102 KB
102 KB
|
50ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
matebookprox-snap.jpg
video.golem.de/teaser/1/1/21518/thumb-high-1000/
|
98 KB
98 KB
|
52ms
17ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
1533308152_hqdefault.jpg
video.golem.de/teaser/1/1/21555/thumb-high-1000/
|
16 KB
17 KB
|
52ms
17ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135822-170262-170259_rc.jpg
www.golem.de/1808/
|
11 KB
12 KB
|
52ms
50ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135820-170250-170247_rc.jpg
www.golem.de/1808/
|
7 KB
7 KB
|
18ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135746-170221-170218_rc.jpg
www.golem.de/1808/
|
5 KB
5 KB
|
19ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135834-170313-170309_rc.jpg
www.golem.de/1808/
|
10 KB
10 KB
|
20ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135817-170242-170237_rc.jpg
www.golem.de/1808/
|
2 KB
3 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135453-168708-168705_rc.jpg
www.golem.de/1807/
|
106 KB
106 KB
|
16ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135306-167826-167818_rc.jpg
www.golem.de/1807/
|
192 KB
192 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135801-170158-170155_rc.jpg
www.golem.de/1808/
|
8 KB
8 KB
|
42ms
41ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135828-170296-170295_rc.jpg
www.golem.de/1808/
|
7 KB
8 KB
|
41ms
41ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135827-170284-170283_rc.jpg
www.golem.de/1808/
|
6 KB
6 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135826-170282-170279_rc.jpg
www.golem.de/1808/
|
9 KB
9 KB
|
20ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135824-170278-170277_rc.jpg
www.golem.de/1808/
|
8 KB
8 KB
|
18ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135825-170276-170273_rc.jpg
www.golem.de/1808/
|
6 KB
6 KB
|
17ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135823-170266-170263_rc.jpg
www.golem.de/1808/
|
9 KB
9 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135821-170258-170255_rc.jpg
www.golem.de/1808/
|
6 KB
6 KB
|
17ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135819-170254-170251_rc.jpg
www.golem.de/1808/
|
7 KB
8 KB
|
32ms
31ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135796-170138-170135_rc.jpg
www.golem.de/1808/
|
10 KB
10 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135818-170246-170243_rc.jpg
www.golem.de/1808/
|
6 KB
7 KB
|
29ms
29ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135624-169860-169854_rc.jpg
www.golem.de/1808/
|
7 KB
8 KB
|
364ms
364ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135816-170236-170233_rc.jpg
www.golem.de/1808/
|
4 KB
4 KB
|
17ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135689-169812-169809_rc.jpg
www.golem.de/1808/
|
8 KB
8 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135815-170217-170216_rc.jpg
www.golem.de/1808/
|
8 KB
8 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135795-170143-170140_rc.jpg
www.golem.de/1808/
|
9 KB
10 KB
|
16ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135812-170204-170203_rc.jpg
www.golem.de/1808/
|
4 KB
5 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135503-168959-168958_rc.jpg
www.golem.de/1808/
|
6 KB
7 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135521-168907-168905_rc.jpg
www.golem.de/1807/
|
17 KB
18 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135477-168702-168700_rc.jpg
www.golem.de/1807/
|
20 KB
20 KB
|
19ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135361-168120-168118_rc.jpg
www.golem.de/1807/
|
22 KB
22 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135357-168175-168173_rc.jpg
www.golem.de/1807/
|
20 KB
20 KB
|
19ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135507-168846-168844_rc.jpg
www.golem.de/1807/
|
15 KB
16 KB
|
17ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135323-168129-168127_rc.jpg
www.golem.de/1807/
|
28 KB
28 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135162-168425-168423_rc.jpg
www.golem.de/1807/
|
28 KB
28 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135324-168080-168078_rc.jpg
www.golem.de/1807/
|
13 KB
14 KB
|
19ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135452-168571-168568_rc.jpg
www.golem.de/1807/
|
22 KB
22 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135383-168222-168220_rc.jpg
www.golem.de/1807/
|
24 KB
24 KB
|
16ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135356-168106-168104_rc.jpg
www.golem.de/1807/
|
17 KB
18 KB
|
18ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135154-168268-168266_rc.jpg
www.golem.de/1807/
|
23 KB
24 KB
|
19ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135180-167241-167239_rc.jpg
www.golem.de/1807/
|
13 KB
13 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135214-167428-167426_rc.jpg
www.golem.de/1807/
|
18 KB
19 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_135331-167979-167977_rc.jpg
www.golem.de/1807/
|
23 KB
23 KB
|
20ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
cpx.php
cpx.golem.de/
|
42 B
420 B
|
66ms
16ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:182
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
5ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=44&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1195580031&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
POST
H/1.1
|
204
No Content
|
cdb
Show response
bidder.criteo.com/
|
0
186 B
|
55ms
14ms
|
XHR
text/plain |
178.250.2.89
ASN-CRITEO-EUROPE
|
|
|
GET
S
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.1.13/
|
4 KB
2 KB
|
39ms
7ms
|
Script
application/javascript |
2600:9000:2047:a000:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
sp_W7V4vf-433666-i_rc.jpg
www.golem.de/6731/
|
68 B
486 B
|
63ms
63ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
collect
stats.g.doubleclick.net/r/
Redirect Chain
-
https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1050885305&utmhn=www.golem.de&utme=8(HTML5)9(1)11(2)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=...
-
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=108889994.1533407801&jid=1536962634&_v=5.7.2&z=1050885305
|
35 B
102 B
|
17ms
15ms
|
Image
image/gif |
2a00:1450:400c:c07::9a
Google LLC
|
|
General
- Full URL
- https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=108889994.1533407801&jid=1536962634&_v=5.7.2&z=1050885305
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Server
-
2a00:1450:400c:c07::9a
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
S
|
200
|
ca-pub-2342548244565729.js
Show response
pagead2.googlesyndication.com/pub-config/r20160913/
|
133 B
239 B
|
34ms
33ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
H2
|
200
|
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20180801/r20180604/
Frame F385
|
0
0
|
8ms
4ms
|
Document
text/html |
2a00:1450:4001:81e::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20180801/r20180604/zrt_lookup.html
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/
Frame 68BE
|
186 KB
69 KB
|
42ms
39ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
rmpslider-rl_117-min.js
Show response
www.golem.de/staticrl/scripts/radiant/
|
15 KB
6 KB
|
20ms
17ms
|
XHR
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
63ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
64ms
16ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
62ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
66ms
16ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
64ms
16ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
381ms
96ms
|
XHR
application/json |
52.216.1.195
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
homadclienthttpsle-json.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
286 B
677 B
|
64ms
15ms
|
XHR
application/json |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
rmp.min.js
Show response
www.golem.de/staticrl/scripts/radiant/4.9.1/js/
|
378 KB
110 KB
|
25ms
23ms
|
XHR
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
35ms
34ms
|
Script
text/javascript |
52.17.80.93
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=0&screen=1200x1600&event_id=page_view&_sid=97578&_ver=0.1.13&_seg=jsonp&_=310940349654
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
- Protocol
- HTTP/1.1
- Server
-
52.17.80.93
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-17-80-93.eu-west-1.compute.amazonaws.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
- da8bee83ba5ce5cb5c51c9c871a3893541127f06d069e145d59366462c57d694
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 5571
|
0
0
|
183ms
182ms
|
Document
text/html |
2a00:1450:4001:81e::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=2120986408&adf=2993371392&w=460&lmt=1533407800&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800774&bpp=8&bdt=759&fdt=12&idt=148&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&correlator=410721347715&frm=20&pv=2&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=75&mdo=0&mso=32&u_tz=0&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=453&ady=4084&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=2289871070&ifi=1&fsb=1&xpc=AMvcfpViW0&p=https%3A//www.golem.de&dtd=173
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
osd.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/
|
70 KB
26 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/osd.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
- Protocol
- SPDY
- Server
-
2a00:1450:4001:81f::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 6546ea7bd057a25d0198ff233e30008c8c8f99bcef163ff487a255db68577007
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
229 B
896 B
|
41ms
7ms
|
XHR
application/json |
52.222.150.179
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
115ms
27ms
|
Script
application/javascript |
54.72.140.158
Amazon.com
|
|
|
GET
H/1.1
|
204
No Content
|
m
p.yieldlab.net/
|
0
336 B
|
58ms
14ms
|
Image
text/plain |
85.114.144.198
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
2.gif
xpl.theadex.com/d/327/i/
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasBs_AWsJABibsBSf-BiUABifkBif-BsfABiUABifABfrr
-
https://xpl.theadex.com/d/327/i/2.gif?_sc=1000717912036410004&axd_pid=22&axd_fuid=BSasBs_AWsJABibsBSf-BiUABifkBif-BsfABiUABifABfrr
|
43 B
717 B
|
14ms
13ms
|
Image
image/gif |
89.163.159.116
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
a.js
d.df-srv.de/match/
Redirect Chain
-
https://d.df-srv.de/match/a.js?pid=42
-
https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fd.df-srv.de%2Fmatch%2Fa.js%3Fpid%3D42%26l%3D1%26adition_vid%3D%25%25COOKIE%25%25
-
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6585936356731058199
|
3 B
466 B
|
63ms
12ms
|
Image
application/javascript |
2001:16e0:10a:1::c2:1
RKOM R-KOM Regens...
|
|
|
GET
H/1.1
|
200
OK
|
sp_W7V4vf-108687-i_rc.jpg
www.golem.de/8266/ad_pics/
|
68 B
486 B
|
62ms
61ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/
Frame F818
|
186 KB
0
|
42ms
39ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame D9A1
|
0
0
|
164ms
163ms
|
Document
text/html |
2a00:1450:4001:81e::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=3463405676&adf=3103571475&w=460&lmt=1533407801&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800786&bpp=9&bdt=770&fdt=224&idt=227&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=460x120&correlator=410721347715&frm=20&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=84&mdo=0&mso=32&u_tz=0&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=453&ady=4805&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=1724946463&ifi=2&fsb=1&xpc=9jlyjGVfxY&p=https%3A//www.golem.de&dtd=239
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.golem.de/800302642e2d6d2c2b1c3324043d8966a016239d/
|
184 KB
51 KB
|
71ms
38ms
|
XHR
application/javascript |
176.9.101.100
HETZNER-AS
|
|
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/
Frame 4D97
|
186 KB
0
|
42ms
39ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 7AB2
|
0
0
|
129ms
128ms
|
Document
text/html |
2a00:1450:4001:81e::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=1810682093&adf=700606410&w=460&lmt=1533407801&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800795&bpp=5&bdt=780&fdt=288&idt=291&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=460x120%2C460x120&correlator=410721347715&frm=20&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=84&mdo=0&mso=32&u_tz=0&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=453&ady=5527&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=1026561616&ifi=3&fsb=1&xpc=BJ8lwemWvt&p=https%3A//www.golem.de&dtd=305
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
vgs.json
Show response
cdn.radiantmediatechs.com/rmp/rr/
|
3 KB
2 KB
|
45ms
11ms
|
XHR
application/json |
2400:cb00:2048:1::6818:6724
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
|
57 KB
12 KB
|
20ms
19ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
/
iqdigital.demdex.net/event/
|
42 B
623 B
|
148ms
41ms
|
Image
image/gif |
52.49.47.75
Amazon.com
|
|
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/
Frame 2C86
|
186 KB
0
|
42ms
39ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
display-ohne-werbung3.png
www.golem.de/staticrl/images/abo/
|
924 B
1 KB
|
20ms
18ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
display-mit-werbung3.png
www.golem.de/staticrl/images/abo/
|
1 KB
1 KB
|
19ms
16ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame C07E
|
0
0
|
114ms
27ms
|
Document
text/html |
54.77.222.97
Amazon.com
|
|
|
GET
S
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
|
231 KB
79 KB
|
65ms
41ms
|
Script
text/javascript |
2a00:1450:4001:810::200a
Google LLC
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
68 B
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
|
184 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
|
8 KB
9 KB
|
18ms
18ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
2 KB
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
|
15 KB
15 KB
|
17ms
17ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
dest5.html
iqdigital.demdex.net/
Frame D21A
|
0
0
|
30ms
29ms
|
Document
text/html |
52.49.47.75
Amazon.com
|
|
General
- Full URL
- https://iqdigital.demdex.net/dest5.html?d_nsid=0
- Requested by
- Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.49.47.75
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-49-47-75.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
|
POST
H/1.1
|
200
OK
|
event
Show response
iqdigital.demdex.net/
|
848 B
2 KB
|
69ms
36ms
|
XHR
application/json |
52.49.47.75
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
ibs:dpid=411&dpuuid=W2XyOQAABuTbdzx0
dpm.demdex.net/
Redirect Chain
-
https://cm.everesttech.net/cm/dd?d_uuid=15523052123455657943557814271170652056
-
https://dpm.demdex.net/ibs:dpid=411&dpuuid=W2XyOQAABuTbdzx0
|
42 B
764 B
|
187ms
186ms
|
Image
image/gif |
35.165.133.163
Amazon.com
|
|
|
GET
H2
|
200
|
bridge3.225.0_de.html
imasdk.googleapis.com/js/core/
Frame 9C5B
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:810::200a
Google LLC
|
|
General
- Full URL
- https://imasdk.googleapis.com/js/core/bridge3.225.0_de.html
- Requested by
- Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:810::200a
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
client.js
Show response
s0.2mdn.net/instream/video/
|
26 KB
10 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:81c::2006
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
389ms
109ms
|
XHR
application/json |
52.216.1.195
Amazon.com
|
|
General
- Full URL
- https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=9454056353
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
- Protocol
- HTTP/1.1
- Server
-
52.216.1.195
Ashburn, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- s3-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H/1.1
|
200
OK
|
homadclienthttpsle-json.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
286 B
677 B
|
47ms
16ms
|
XHR
application/json |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
General
- Full URL
- https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php?cache=2570722747
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a00:13c8:f5::f:4b3d:175
, Germany,
ASN25291
(SYSELEVEN SysEleven GmbH, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
27 KB
7 KB
|
187ms
186ms
|
XHR
text/javascript |
172.217.22.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=728x90&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile1%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D1%26m_mv%3D80%2C70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801666&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=0&adk=1018996689&gut=v2&ifi=5&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.golem.de%2F&dssz=87&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x-1&msz=1000x-1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
172.217.22.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s17-in-f66.1e100.net
- Software
-
cafe /
- Resource Hash
- 8cccd4f61058a5068c3e3391580e38565fbbcacb286b802e6db362fa9e48d52e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
pubads_impl_rendering_237.js
Show response
securepubads.g.doubleclick.net/gpt/
|
42 KB
16 KB
|
40ms
39ms
|
Script
text/javascript |
172.217.22.66
Google LLC
|
|
|
GET
S
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-29/html/
|
0
0
|
6ms
6ms
|
Other
text/html |
2a00:1450:4001:81c::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
2a00:1450:4001:81c::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
30 KB
10 KB
|
409ms
409ms
|
XHR
text/javascript |
172.217.22.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=1000x333%7C1000x250%7C1000x100%7C970x90%7C940x250%7C970x250%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile3%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D3%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801681&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=3248118628&gut=v2&ifi=6&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.golem.de%2F&dssz=88&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x11198&msz=1000x333&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
172.217.22.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s17-in-f66.1e100.net
- Software
-
cafe /
- Resource Hash
- 65a942306bd489ce6f7e9a200a578e3144d344fbf78b567217f7a6b30892b0a9
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
27 KB
7 KB
|
611ms
610ms
|
XHR
text/javascript |
172.217.22.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=300x300%7C300x600%7C300x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile9%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D9%26m_mv%3D30%2C20%2C10%26m_gv%3D30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801691&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=3347207360&gut=v2&ifi=7&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.golem.de%2F&dssz=88&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x483&msz=300x302&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
172.217.22.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s17-in-f66.1e100.net
- Software
-
cafe /
- Resource Hash
- 8372653a80b960d6c20b63c9579e60b63c3235ab7a41ee1c23b547057fed6b63
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
27 KB
7 KB
|
796ms
795ms
|
XHR
text/javascript |
172.217.22.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=1000x333%7C1000x167%7C1000x125%7C1000x100%7C970x250%7C800x250%7C970x90%7C728x90%7C660x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile16%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D16&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801700&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=1899381156&gut=v2&ifi=8&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.golem.de%2F&dssz=88&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x418&msz=1000x333&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
172.217.22.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s17-in-f66.1e100.net
- Software
-
cafe /
- Resource Hash
- 17537145b679ff12e66022957073c236b926e6938fb38da82f034e53f95f2776
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
229 B
887 B
|
20ms
7ms
|
XHR
application/json |
52.222.150.128
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=9839800392
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
- Protocol
- HTTP/1.1
- Server
-
52.222.150.128
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-52-222-150-128.fra53.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 25d819bf5e7ae2c998690015c6e8958ddceb44dac2497783eb70680c777a7406
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.golem.de/9b397e07d1be0e16e3d2ac8f9dd2f903c2921cdd/
|
229 B
1 KB
|
72ms
38ms
|
XHR
application/json |
176.9.3.108
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/9b397e07d1be0e16e3d2ac8f9dd2f903c2921cdd/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
176.9.3.108
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.108.3.9.176.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- 25d819bf5e7ae2c998690015c6e8958ddceb44dac2497783eb70680c777a7406
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
24 KB
7 KB
|
872ms
872ms
|
XHR
text/javascript |
172.217.22.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=300x300%7C300x600%7C300x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile8%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D8%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801792&frm=20&biw=1585&bih=1200&oid=3&adx=993&ady=868&adk=767446483&gut=v2&ifi=9&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.golem.de%2F&dssz=88&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x671&msz=300x300&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
172.217.22.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s17-in-f66.1e100.net
- Software
-
cafe /
- Resource Hash
- ef17b586a6d93ed703c8f3c1886787ffeee59b66420c382951201361c6779b02
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
23 KB
6 KB
|
1009ms
1008ms
|
XHR
text/javascript |
172.217.22.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy6&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=1000x500%7C1000x333%7C1000x250%7C1000x167%7C1000x125%7C1000x100%7C970x90%7C800x250%7C970x250%7C970x90%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile4%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D4%26m_mv%3D60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801806&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=1259&adk=1192895965&gut=v2&ifi=10&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.golem.de%2F&dssz=88&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x503&msz=1000x500&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
172.217.22.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s17-in-f66.1e100.net
- Software
-
cafe /
- Resource Hash
- cfd906b7da0a689f73ffec765f41b30ee93374980ca9613d7950e1ecb73e1f22
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.golem.de/
|
24 B
281 B
|
25ms
1ms
|
Script
application/octet-stream |
188.40.138.133
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/hic_qos?adv_partner&_werbebanner_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
188.40.138.133
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.133.138.40.188.clients.your-server.de
- Software
-
openresty/1.13.6.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.golem.de/ad3e0f383fa15913a252794d4ff8ba3c5e108edc/
|
110 B
672 B
|
8ms
8ms
|
XHR
application/json |
188.40.138.133
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/ad3e0f383fa15913a252794d4ff8ba3c5e108edc/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
188.40.138.133
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.133.138.40.188.clients.your-server.de
- Software
-
TornadoServer/4.5.3 /
- Resource Hash
- 9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/
Frame 2E52
|
71 KB
26 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81c::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
2a00:1450:4001:81c::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 40e8db13f44571762fa6e5704ca8bb1a73c2cce35e83603e9ac131ab8127db7e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
desktop-banner-728.shtml
Show response
video.golem.de/bannertest/golem/
Frame B0CF
|
1 KB
887 B
|
16ms
15ms
|
Document
text/html |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 2E52
|
0
57 B
|
43ms
43ms
|
Image
text/html |
172.217.22.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsslVJDvUofXoO4FfdIw4WwPYOKKBfjeuxPRtB--worrizF8G2wxpWUjZLwAY07BEXhAH2IxZSB7-fBw4PumB99cItOVuRBqdUuiuRNo4AUi_Deevc4X6dg8gKViwZAd4sFfesJ1SZyXwRvxpm3ptbHd0qL-wHhVWFnTg_L-27Aef8tUU615xxWA6Tz3QUQHN3HSh-gSQlBa2rBkNGD4nKnjN9HqLKVhs0LoqVkfU9ridejQ2LupfA&sai=AMfl-YR8LLgkmGrzjBSI0KrY5SsdqTXx8ZxDCIAlbtw62RiLVB7W7huyUvJ9L5twaEHRalN57HsWVhMNWVqYJEXoqZQgfE7sEJAMSneBkX6I7INsRcEULBM6ApNOh1WT&sig=Cg0ArKJSzEItKr2Ac3NkEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Server
-
172.217.22.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s17-in-f66.1e100.net
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
6ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile1&zMoatRendered=1&zMoatSlotTargetingLoaded=1&zMoatSlotTargetingSet=1&zMoatPageDataTargetingSet=1&zMoatSafetyTargetingSet=1&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=687884070&cs=0
- Protocol
- HTTP/1.1
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
imgad
pagead2.googlesyndication.com/pagead/
|
2 KB
3 KB
|
6ms
6ms
|
Image
image/png |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame 2E52
|
254 KB
79 KB
|
6ms
6ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 2E52
|
220 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
font-face-1.0.4.css
video.golem.de/staticrl/styles/
Frame B0CF
|
2 KB
765 B
|
17ms
16ms
|
Stylesheet
text/css |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
accountpromo-desktop7.css
video.golem.de/bannertest/golem/
Frame B0CF
|
2 KB
1 KB
|
16ms
15ms
|
Stylesheet
text/css |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
Frame B0CF
|
43 B
292 B
|
44ms
15ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
display-ohne-werbung2.png
video.golem.de/bannertest/golem/img/
Frame B0CF
|
5 KB
5 KB
|
15ms
14ms
|
Image
image/png |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
display-mit-werbung2.png
video.golem.de/bannertest/golem/img/
Frame B0CF
|
4 KB
5 KB
|
15ms
15ms
|
Image
image/png |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans-Bold.woff2
video.golem.de/staticrl/fonts/droidsans/
Frame B0CF
|
22 KB
22 KB
|
16ms
15ms
|
Font
application/octet-stream |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans.woff2
video.golem.de/staticrl/fonts/droidsans/
Frame B0CF
|
21 KB
21 KB
|
15ms
15ms
|
Font
application/octet-stream |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-29/html/
Frame 7684
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:81c::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_237.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:81c::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
5ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile3&zMoatRendered=2&zMoatSlotTargetingLoaded=2&zMoatSlotTargetingSet=2&zMoatPageDataTargetingSet=2&zMoatSafetyTargetingSet=2&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=2034290169&cs=0
- Protocol
- HTTP/1.1
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
Frame DB9A
|
74 KB
27 KB
|
30ms
30ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/
Frame DB9A
|
71 KB
0
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81c::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
2a00:1450:4001:81c::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 40e8db13f44571762fa6e5704ca8bb1a73c2cce35e83603e9ac131ab8127db7e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame DB9A
|
254 KB
0
|
6ms
6ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame DB9A
|
211 B
0
|
|
Image
image/png |
|
|
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame DB9A
|
0
60 B
|
43ms
42ms
|
Image
text/html |
172.217.22.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjste7r7PSnnIPiXR529ELsAK8ZSiGKcI-iH2PU4oHpYdeM9DxLvrMVpXJyAe-rItftY_TcUJVoawIFeeBug8L07l1zu-5CyBNdjR2btr_VplqPTvsBPdHj_52q4SLMcIewT3RH6CVMoNWLjQrV5IEa_x5SFRdE-arZtbNBaWim-ELzS_OI7lNIbktU-29SQATtkybA239jECQ_a33HMzag56eHNvJe-M7fpBCknhE5BLW3vxf9p5nLZxhIE&sai=AMfl-YQiB3ZOwP-PzAOkZIcbaHvu7z90-PRmr7_aP4CMwjwdBdgX63Sv64We_VZGmuNnyvPr4pBR3YXnVT5W666OvptF6etLXyNFCQZbFVEC3yg1zkgKeOKbjyGkfuk&sig=Cg0ArKJSzKyjllxGvDPREAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Server
-
172.217.22.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s17-in-f66.1e100.net
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
5ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile9&zMoatRendered=3&zMoatSlotTargetingLoaded=3&zMoatSlotTargetingSet=3&zMoatPageDataTargetingSet=3&zMoatSafetyTargetingSet=3&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1637727332&cs=0
- Protocol
- HTTP/1.1
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
Frame DB9A
|
109 B
171 B
|
27ms
26ms
|
Script
application/javascript |
2a00:1450:4001:81e::2002
Google LLC
|
|
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
Frame DB9A
|
109 B
171 B
|
27ms
27ms
|
Script
application/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
|
GET
S
|
200
|
ca-pub-6583763995580712.js
Show response
pagead2.googlesyndication.com/pub-config/r20160913/
Frame DB9A
|
68 B
179 B
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/
Frame E2F1
|
186 KB
0
|
42ms
39ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 4E7B
|
0
0
|
264ms
263ms
|
Document
text/html |
2a00:1450:4001:81e::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=3923427907&adk=825103508&adf=2162829632&w=300&guci=1.2.0.0.2.2.0&format=300x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&avail_w=0&wgl=1&dt=1533407802351&bpp=7&bdt=634&fdt=7&idt=9&shv=r20180801&cbv=r20180604&saldr=aa&correlator=410721347715&frm=23&ife=4&pv=2&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=1895738927&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&mdo=0&mso=0&u_tz=0&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=993&ady=4144&biw=1585&bih=1200&isw=300&ish=250&ifk=1933803164&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226400&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C300%2C250&vis=1&rsz=o%7Co%7CeEbr%7C&abl=NS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=606431463&ifi=1&fsb=1&dtd=17
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
osd.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/
Frame DB9A
|
70 KB
26 KB
|
7ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/osd.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
- Protocol
- SPDY
- Server
-
2a00:1450:4001:81f::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 6546ea7bd057a25d0198ff233e30008c8c8f99bcef163ff487a255db68577007
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
Frame 162F
|
74 KB
27 KB
|
30ms
30ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/
Frame 162F
|
71 KB
0
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81c::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
2a00:1450:4001:81c::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 40e8db13f44571762fa6e5704ca8bb1a73c2cce35e83603e9ac131ab8127db7e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame 162F
|
254 KB
79 KB
|
6ms
6ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 162F
|
210 B
0
|
|
Image
image/png |
|
|
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 162F
|
0
61 B
|
43ms
43ms
|
Image
text/html |
172.217.22.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstiv3cGE6c6YmE9CPNPxKJ2aSMF4c5O7ac-N8w4ubiymOVh_1i_7RcmtWpnq5OdQqI0l7a-FmkihBEdEIHx6q8dB722EUfrdtKZcGTdOoyRh4OInuE6S7lvSxdXYjrAalC41unSOYILgBiFCh4CFaw1uqOMF65L4rFh6aYPi7ZYLjRlpzHY7nloidb5rBYBS_ZjCgutDTChs0qc98K-ly56gEmH2j4qfWeHsy7Fltv4NNfFizvay8HPuIE&sai=AMfl-YTe_3f91bsp-QhqpnWGFhtoh4fk5NxHe-r5dh4chllNo5FF375Qqo8DcAGB0ps8YgUF0DlFCKsn56da_J9wQUKLl2miEJntlcpWIpHtMH3EQd1bW50TB23TdwOJ&sig=Cg0ArKJSzMtasxbN0oBYEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Server
-
172.217.22.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s17-in-f66.1e100.net
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
6ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile16&zMoatRendered=4&zMoatSlotTargetingLoaded=4&zMoatSlotTargetingSet=3&zMoatPageDataTargetingSet=4&zMoatSafetyTargetingSet=4&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1136241934&cs=0
- Protocol
- HTTP/1.1
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
Frame 162F
|
109 B
171 B
|
28ms
27ms
|
Script
application/javascript |
2a00:1450:4001:81e::2002
Google LLC
|
|
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
Frame 162F
|
109 B
171 B
|
28ms
27ms
|
Script
application/javascript |
2a00:1450:4001:824::2002
Google LLC
|
|
|
GET
S
|
200
|
ca-pub-6583763995580712.js
Show response
pagead2.googlesyndication.com/pub-config/r20160913/
Frame 162F
|
68 B
152 B
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/
Frame 2CDD
|
186 KB
0
|
42ms
39ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame B507
|
0
0
|
239ms
238ms
|
Document
text/html |
2a00:1450:4001:81e::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=1110963404&adf=4205041376&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&dt=1533407802541&bpp=4&bdt=821&fdt=5&idt=6&shv=r20180801&cbv=r20180604&saldr=aa&correlator=410721347715&frm=23&ife=4&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=646917476&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&mdo=0&mso=0&u_tz=0&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=393&ady=11315&biw=1585&bih=1200&isw=800&ish=250&ifk=539073182&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226400&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=13
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
osd.js
Show response
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/
Frame 162F
|
70 KB
26 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81f::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/osd.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
- Protocol
- SPDY
- Server
-
2a00:1450:4001:81f::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 6546ea7bd057a25d0198ff233e30008c8c8f99bcef163ff487a255db68577007
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
/
golem.whitepaperdb.de/
Frame 9C2E
|
0
0
|
55ms
19ms
|
Document
text/html |
62.138.242.228
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://golem.whitepaperdb.de/?tag=golem
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.138.242.228
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- mail.whitepaperdb.de
- Software
-
nginx /
PHP/7.0.31
PleskLin
- Resource Hash
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/
Frame ADBD
|
71 KB
0
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81c::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
2a00:1450:4001:81c::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 40e8db13f44571762fa6e5704ca8bb1a73c2cce35e83603e9ac131ab8127db7e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame ADBD
|
254 KB
0
|
6ms
6ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame ADBD
|
216 B
0
|
|
Image
image/png |
|
|
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame ADBD
|
0
61 B
|
43ms
41ms
|
Image
text/html |
172.217.22.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstAkf4eXhDeF0u_QiA_hZ6p7yvCOZw5cl_pu21cjC-gAR4yQiQw98hVzHHsBPljRIuEwFEqYvdBBdMUGz27tBKIRfbiY_yGrzdO7XvZB7AIj7g643NRntZR7kCbeMqp-XSyz5SaGuUuzAeZ082LEDjjZ4GlN70a2BWaKuOTwFczlNavpI3ia7L2p7Yk_YyqtU4MHqCM6-LDsTQToqkRlg2RSkSeKeJu6kTThhqnGDJBQfaPJo1iAyRhYEsUSdKDvgaeoFl-DNWt_Q&sai=AMfl-YQtqf_NiEGqV2_JmyIwUmUN2hmaeA8f4z3yvXYkN1YInkYZD6sXQxAIt2RQJgV1lvYn9QHVkxav9rtU207DkLvIgcYK1ty64n1KCGCDRNwlmeCTo5oxuCvJVXY&sig=Cg0ArKJSzFX3sXE1TboEEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Server
-
172.217.22.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s17-in-f66.1e100.net
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
7ms
5ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile8&zMoatRendered=5&zMoatSlotTargetingLoaded=5&zMoatSlotTargetingSet=4&zMoatPageDataTargetingSet=5&zMoatSafetyTargetingSet=5&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=193575350&cs=0
- Protocol
- HTTP/1.1
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/
Frame 2F6D
|
71 KB
0
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81c::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
- Protocol
- SPDY
- Server
-
2a00:1450:4001:81c::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 40e8db13f44571762fa6e5704ca8bb1a73c2cce35e83603e9ac131ab8127db7e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame 2F6D
|
254 KB
0
|
6ms
6ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 2F6D
|
217 B
0
|
|
Image
image/png |
|
|
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 2F6D
|
0
52 B
|
42ms
42ms
|
Image
text/html |
172.217.22.66
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvAAGoDF0peBFyu1QBzkEmSHQGcdaCnOYi_olBR_1jtWJsJcyKAfv_39x8CAV5o8GRw4qKSg3n3QQp21XvKTIHJkGmed0HtVR1hPXMuEVuZyzRGKqWNJTtNz06qk3ypCpVneGQyR2169Vh83yTZCRGqNxDc-SCA-QtVigqgMIY15TDIeeK1bbmsUbq2rEw2dXsBaNwBR1PJV0xbhPEzbmRX-zxuo_5ntAtr0FssDVBeOjjJme6Fbw&sai=AMfl-YSPWlQqt6-s0kkwLt3qrtavC0b9ksGn0z4NsnJpUvKv9Jf6GqWuWvbrEEy05br9OevRONdg5SDaRnBnEeb_kG7jki5ysn4VklMz5BWnQIBWfwKwYxef07da2Xk&sig=Cg0ArKJSzGXeC1bDj6u3EAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Server
-
172.217.22.66
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s17-in-f66.1e100.net
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
5ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile4&zMoatRendered=6&zMoatSlotTargetingLoaded=6&zMoatSlotTargetingSet=5&zMoatPageDataTargetingSet=6&zMoatSafetyTargetingSet=6&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1769618959&cs=0
- Protocol
- HTTP/1.1
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 2E52
|
42 B
122 B
|
15ms
14ms
|
Image
image/gif |
2a00:1450:4001:81f::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstzOpo50IQOGgtDcsdxQKZNTRpEP2BbkGMXpq712l4a-DrqoubILj65UuUeX8HGEwk5YT5p06FlRColdQbYkavF2h9Be5lLF8A&sig=Cg0ArKJSzGpiKax7-cbcEAE&adk=1018996689&tt=1091&bs=1585,1200&mtos=1068,1068,1068,1068,1068&tos=1068,0,0,0,0&p=20,293,110,1021&mcvt=1068&rs=3&ht=0&tfs=824&tls=1892&mc=1<e=1&bas=0&bac=0&avms=geo&rst=1533407801868&rpt=0&bos=1600,1200&ps=1585,11570&ss=1600,1200&pt=803&deb=1-3-9-25-19-3-348-9&tvt=1868&op=1&r=v&id=osdim&ti=1&uc=54&tgt=DIV&cl=1&cec=8&clc=1&cac=0&cd=728x90&v=r20180801
- Protocol
- SPDY
- Server
-
2a00:1450:4001:81f::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|