GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
|
141 KB
55 KB
|
165ms
149ms
|
Document
text/html |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
source-sans-pro-v11-latin-700.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
15 KB
15 KB
|
8ms
8ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-700.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
|
GET
H2
|
200
|
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
15 KB
16 KB
|
10ms
9ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
|
GET
H2
|
200
|
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
16 KB
16 KB
|
11ms
10ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
|
GET
H2
|
200
|
metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Show response
js.stroeermediabrands.de/
|
239 KB
58 KB
|
24ms
8ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
24ms
6ms
|
Script
application/javascript |
151.101.114.217
Fastly
|
|
General
- Full URL
- https://cdn.speedcurve.com/js/lux.js?id=131387135
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.217
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
Apache /
- Resource Hash
- 8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
pre-a4c7814ded.js
Show response
www.giga.de/static-local/dist/assets/js/
|
33 KB
10 KB
|
13ms
13ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-82026d3d61.css
www.giga.de/static-local/dist/assets/css/
|
400 KB
53 KB
|
14ms
13ms
|
Stylesheet
text/css |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
34 KB
11 KB
|
35ms
11ms
|
Script
application/javascript |
91.215.103.64
INFONLINE-AS
|
|
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
28 KB
11 KB
|
20ms
1ms
|
Script
application/javascript |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
martin-maciej-rcm40x40.jpg
static.giga.de/wp-content/uploads/2013/04/
|
1 KB
2 KB
|
25ms
7ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2013/04/martin-maciej-rcm40x40.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 505b170e929bca71e7fec8a2bff588459b60e1e9bc99e6f68443d29b3cd73335
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
104 KB
38 KB
|
33ms
21ms
|
Script
text/javascript |
2a00:1450:4001:820::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 797d081d5d1cf52578e5286bb19c0d62adc09b0556171dcec2003b1e80bee59d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
1.gif
www.gstatic.com/psa/static/
|
53 B
174 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:818::2003
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
-
https://ssl-econa.met.vgwort.de/na/c50e6523a40d4ebda6d075c30346eeff
-
https://ssl-econa.met.vgwort.de/blank.gif
|
43 B
310 B
|
12ms
11ms
|
Image
image/gif |
161.156.66.178
SoftLayer Technol...
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
350 B
|
18ms
6ms
|
Image
image/gif |
2a03:2880:f11c:8183:face:b00c:0:25de
Facebook
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
43 KB
17 KB
|
7ms
6ms
|
Script
text/javascript |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-a4c7814ded.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
apstag.js
Show response
c.amazon-adsystem.com/aax2/
|
86 KB
25 KB
|
20ms
7ms
|
Script
application/javascript |
13.225.86.250
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://cdn.m6r.eu/sync/api
-
https://tracking.m6r.eu/sync/api?checkcookies=true
|
1 KB
1 KB
|
34ms
16ms
|
Script
application/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
203 B
|
27ms
8ms
|
XHR
application/vnd.api+json |
193.46.63.75
INFONLINE-AS
|
|
General
- Full URL
- https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=software_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.551837739733505
- Requested by
- Host: script.ioam.de
URL: https://script.ioam.de/iam.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
193.46.63.75
Alfter, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- irqs.ioam.de
- Software
-
nginx /
- Resource Hash
- 9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H/1.1
|
200
OK
|
tx.io
Show response
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0015&i2=0015969c7bbd76f9a5dcf28b8&ep=1596200571&vr=415&i...
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0015&i2=0015969c7bbd76f9a5dcf28b8&ep=1596200571&vr=415&i...
|
0
694 B
|
12ms
12ms
|
Script
application/x-javascript |
91.215.103.65
INFONLINE-AS
|
|
General
- Full URL
- https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0015&i2=0015969c7bbd76f9a5dcf28b8&ep=1596200571&vr=415&id=sxnjyl&i3=0015969c7bbd76f9a5dcf28b8%3A1600641464610%3A1573857464610%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1573857464610&n1=3&dntt=0<=1573857464612&ev=&cs=uqs7p5&mo=1&sr=71
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
91.215.103.65
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de3.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.05.0 0029
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
|
10 KB
10 KB
|
8ms
8ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
lazyload-65c07b80e0.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/lazyload/
|
5 KB
2 KB
|
8ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
2006343101
Show response
videos.giga.de/embed/
Frame A0DF
|
9 KB
3 KB
|
49ms
22ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
js
Show response
www.google-analytics.com/gtm/
|
58 KB
22 KB
|
14ms
14ms
|
Script
application/javascript |
2a00:1450:4001:81b::200e
Google LLC
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
991 B
918 B
|
25ms
10ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
18ms
6ms
|
XHR
application/javascript |
13.225.86.250
Amazon.com
|
|
|
GET
H/1.0
|
200
OK
|
z.js
Show response
go.giga-abs.de/
|
1 KB
1 KB
|
31ms
6ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/z.js?0.3455261104973595
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame FDA4
Redirect Chain
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
|
0
0
|
21ms
21ms
|
Document
text/html |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
51 KB
16 KB
|
50ms
38ms
|
Script
text/javascript |
172.217.23.98
Google LLC
|
|
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
297 KB
92 KB
|
35ms
7ms
|
Script
application/javascript |
13.224.196.8
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
124 KB
48 KB
|
27ms
6ms
|
Script
text/javascript |
2.18.233.67
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
|
97 B
599 B
|
24ms
23ms
|
XHR
application/json |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/54e5aab1-0de9-44e6-a69b-97ed84e8d58a/si.nuggad.net/
Redirect Chain
-
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
-
https://nugmw.userreport.com/rc-ap/54e5aab1-0de9-44e6-a69b-97ed84e8d58a/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecial...
|
2 KB
2 KB
|
50ms
23ms
|
Script
text/javascript |
2600:9000:2156:e800:1f:a1b:34c0:93a1
Amazon.com
|
|
General
- Full URL
- https://nugmw.userreport.com/rc-ap/54e5aab1-0de9-44e6-a69b-97ed84e8d58a/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:2156:e800:1f:a1b:34c0:93a1
, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- 99129e2ded9b089496faf07cd01db4f88b131f81ddde8641bbd035a089bc6d0e
|
GET
H/1.1
|
200
OK
|
ad-loading.gif
www.dunkirkinception.com/detect/
|
130 B
441 B
|
36ms
8ms
|
Image
image/png |
35.156.29.62
Amazon.com
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
40ms
6ms
|
Script
application/javascript |
2600:9000:21f3:5c00:15:efbc:e300:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
18 KB
18 KB
|
15ms
8ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
778 B
|
30ms
15ms
|
Script
application/javascript |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.giga.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
778 B
|
30ms
15ms
|
Script
application/javascript |
2a00:1450:4001:820::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.giga.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20191112/r20190131/
|
242 KB
89 KB
|
27ms
27ms
|
Script
text/javascript |
2a00:1450:4001:820::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20191112/r20190131/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- d7c3238b2195fb180a902a65cbe1fbb8f174f042f9df4a0f31dc60ebadef26f3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191112/r20190131/
Frame 5AF0
|
0
0
|
5ms
5ms
|
Document
text/html |
2a00:1450:4001:817::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20191112/r20190131/zrt_lookup.html
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
post-33dedcb970.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
8ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-772cc0e021.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
31 KB
12 KB
|
9ms
9ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
smb-phone-plan-ef34ebe4f8.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
|
53 KB
18 KB
|
11ms
10ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/smb-phone-plan-ef34ebe4f8.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
|
GET
H2
|
200
|
article-rating-7143c629e5.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
306 B
534 B
|
8ms
7ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
loader.js
Show response
c.nativendo.de/cdn/asset/js/
|
54 KB
17 KB
|
55ms
19ms
|
Script
application/javascript |
2606:4700:20::6819:ac0d
Cloudflare
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/r/
|
35 B
111 B
|
13ms
13ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=1076815648&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=6GBAAEADQ~&jid=1407346342&gjid=1547931220&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&_r=1&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&z=1573103794
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
109 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd21=auto&cm17=1&cd18=4282584&z=849548494
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
videojs-ff0ddd6c.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame A0DF
|
618 KB
206 KB
|
15ms
15ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame A0DF
|
272 KB
93 KB
|
59ms
38ms
|
Script
text/javascript |
2a00:1450:4001:81d::200a
Google LLC
|
|
|
GET
H2
|
200
|
ad.ytn.Xe0_BSUrLx6.gif
www.giga.de/images/
|
71 B
474 B
|
35ms
35ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
28ms
27ms
|
Script
text/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
7ms
6ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/o.gif?__ir=&__is=1600_1200_24&__iu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&__id=1573857464780&__it=-60&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- 2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame B45E
|
0
0
|
159ms
159ms
|
Document
text/html |
2a00:1450:4001:817::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1459277723&w=468&lmt=1573857464&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&flash=0&wgl=1&dt=1573857464711&bpp=7&bdt=149&fdt=83&idt=83&shv=r20191112&cbv=r20190131&saldr=aa&abxe=1&correlator=453027684172&frm=20&pv=2&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&ga_fc=0&iag=0&icsg=206393356280&dssz=63&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=486&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065125&oid=3&pvsid=3992682346307461&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=6YV9SgWTZA&p=https%3A//www.giga.de&dtd=95
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191112/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
|
78 KB
29 KB
|
15ms
14ms
|
Script
text/javascript |
2a00:1450:4001:817::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191112/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 8b2aa8c4b8f427191eea2b79bc69896ef382a2c45ea01abe3efaf4d9b340242b
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
38ms
16ms
|
Script
application/javascript |
178.19.65.130
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame A0DF
|
53 KB
15 KB
|
8ms
8ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame A0DF
|
1015 B
1 KB
|
8ms
8ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
pubads_impl_2019111201.js
Show response
securepubads.g.doubleclick.net/gpt/
|
160 KB
59 KB
|
38ms
38ms
|
Script
text/javascript |
172.217.23.98
Google LLC
|
|
|
GET
H2
|
200
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
117 KB
22 KB
|
21ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
103 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=direkt%20bei%20PayPal&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fwebapps%2Fmpp%2Fpaypal-fees&cd41=Content%201&cd45=all&cm75=1&z=331981304
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
103 B
|
7ms
7ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Zum%20Geb%C3%BChrenrechner*&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fib5j&cd41=Content%202&cd45=all&cm75=1&z=148073493
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
103 B
|
7ms
6ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=OlegDoroshin&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=http%3A%2F%2Fwww.shutterstock.com%2Fgallery-363469p1.html%3Fcr%3D00%26pl%3Dedit-00&cd41=Content%203&cd45=all&cm75=1&z=863061306
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
103 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Shutterstock.com&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=http%3A%2F%2Fwww.shutterstock.com%2Feditorial%3Fcr%3D00%26pl%3Dedit-00&cd41=Content%204&cd45=all&cm75=1&z=770108297
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame E8D5
|
0
0
|
15ms
15ms
|
Document
text/html |
2a00:1450:4001:817::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1573857464&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1573857464718&bpp=4&bdt=156&fdt=115&idt=115&shv=r20191112&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=453027684172&frm=20&pv=1&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&ga_fc=0&iag=0&icsg=3302293700392&dssz=67&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065125&oid=3&pvsid=3992682346307461&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=119
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191112/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H2
|
200
|
session
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
239 B
|
20ms
6ms
|
XHR
text/plain |
3.122.213.19
Amazon.com
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
98 B
486 B
|
79ms
79ms
|
XHR
text/javascript |
13.225.86.250
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&pid=oGnqZVI4F6N3i&cb=0&ws=1600x1200&v=7.43.01&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%22sky%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22200x600%22%2C%22120x600%22%2C%22301x601%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%5D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.225.86.250
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-13-225-86-250.fra2.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- e48f08b200b1d8a4054305847126d87a19219dfb882be603e9c3b30f4062a6bc
|
POST
H2
|
204
|
v1
Show response
dmx.districtm.io/b/
|
0
428 B
|
32ms
16ms
|
XHR
text/plain |
104.16.68.69
Cloudflare
|
|
General
- Full URL
- https://dmx.districtm.io/b/v1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.68.69
, United States,
ASN13335
(CLOUDFLARENET - Cloudflare, Inc., US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
GET
H2
|
200
|
arj
Show response
yieldlove-d.openx.net/w/1.0/
|
4 KB
5 KB
|
22ms
20ms
|
XHR
application/json |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=7c2af6fa-3dc1-490a-9a3a-0347a20dde99%2C4a5a38c3-368d-4f3b-b030-ff0730c67295%2C88f4c4e8-8ded-4d93-9c0f-4f60248c2241&nocache=1573857464893&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%2C301x601%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle%2Csky%2Cbanner&auid=539390940%2C540714782%2C540847469&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.167.1 /
- Resource Hash
- 8c832c688b6e9f37d0065e3ca18adebf2787d3791be4bd3fa2e71bcf4c4ce819
|
POST
H2
|
204
|
translator
Show response
hbopenbid.pubmatic.com/
|
0
113 B
|
104ms
78ms
|
XHR
text/plain |
185.64.189.112
PubMatic
|
|
|
GET
H/1.1
|
200
OK
|
cygnus
Show response
as-sec.casalemedia.com/
|
25 B
901 B
|
166ms
153ms
|
XHR
application/json |
2.18.234.21
Akamai Technologies
|
|
General
- Full URL
- https://as-sec.casalemedia.com/cygnus?s=254711&v=7.2&r=%7B%22id%22%3A%2213c8fc0b0789768%22%2C%22imp%22%3A%5B%7B%22id%22%3A%221477d4711e41244%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22254711%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%2215d12426dc18069%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2216fa2832b9b06c6%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2217f79d85b92308c%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%221879becae816f61%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%221961dcf9dfffe3%22%2C%22banner%22%3A%7B%22w%22%3A301%2C%22h%22%3A601%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%22209da46d0b8ca42%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%22216c86b721fcbbd%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%22222eee13bf99623%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%2223e24bc340468dc%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.234.21
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-234-21.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- 7ef74b1ad1f804099bed8427568f0f8df0364509a4cb024d4cfdb12a85af0929
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
145 B
|
53ms
25ms
|
XHR
text/plain |
35.206.134.202
Google LLC
|
|
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
144 B
|
68ms
41ms
|
XHR
text/plain |
35.206.134.202
Google LLC
|
|
|
POST
H2
|
204
|
bid
Show response
orbidder.otto.de/
|
0
144 B
|
53ms
25ms
|
XHR
text/plain |
35.206.134.202
Google LLC
|
|
|
POST
H2
|
204
|
cdb
Show response
bidder.criteo.com/
|
0
141 B
|
63ms
20ms
|
XHR
text/plain |
178.250.2.152
ASN-CRITEO-EUROPE
|
|
|
POST
H2
|
200
|
auction
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
239 B
|
6ms
6ms
|
XHR
text/plain |
3.122.213.19
Amazon.com
|
|
|
GET
H2
|
200
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
|
85 KB
30 KB
|
5ms
5ms
|
Script
text/javascript |
2a00:1450:4001:809::200a
Google LLC
|
|
General
- Full URL
- https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
smb-article-rating-f9506c2d61.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
|
18 KB
6 KB
|
8ms
8ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/smb-article-rating-f9506c2d61.min.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=831c33358ecbd0f2ccffa910b98a4397&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D831c33358ecbd0f2ccffa910b98a4397%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=831c33358ecbd0f2ccffa910b98a4397&userId=adscale-user:6898c7d418424225bf66be962d28c288
|
44 B
528 B
|
18ms
18ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=gxwzNY7L0PLM_6kQuYpDlw
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
|
44 B
523 B
|
17ms
17ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
impl.20191112-12-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
416 KB
117 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
beacon.js
Show response
sb.scorecardresearch.com/
|
1 KB
1 KB
|
21ms
9ms
|
Script
application/x-javascript |
2.16.31.65
Akamai Technologies
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
12 KB
4 KB
|
283ms
281ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3992682346307461&correlator=3722306851540671&output=ldjh&impl=fif&adsid=NT&eid=21064169&vrg=2019111201&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191115&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D1%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D831c33358ecbd0f2ccffa910b98a4397%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1573857464&dt=1573857464981&dlt=1573857464563&idt=399&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2257154448&uci=1&ifi=2&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=71&icsg=52836699206200&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- f16ba37c4eacfc7f38a1a0de664a9e7e3b9e15b1215a20198f9161acaff3adc7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019111201.js
Show response
securepubads.g.doubleclick.net/gpt/
|
64 KB
25 KB
|
39ms
38ms
|
Script
text/javascript |
172.217.23.98
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/
|
0
0
|
9ms
8ms
|
Other
text/html |
2a00:1450:4001:819::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:819::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
8 KB
4 KB
|
494ms
494ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3992682346307461&correlator=3722306851540671&output=ldjh&impl=fif&adsid=NT&eid=21064169&vrg=2019111201&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191115&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D1%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D831c33358ecbd0f2ccffa910b98a4397%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1573857464&dt=1573857464992&dlt=1573857464563&idt=399&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2778923653&uci=2&ifi=3&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=72&icsg=52836699206200&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- f2b586b6c1b604fceca3874a4af24cfd8eeaddb80ceba2aa183d0896e618c141
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
8 KB
4 KB
|
677ms
676ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3992682346307461&correlator=3722306851540671&output=ldjh&impl=fif&adsid=NT&eid=21064169&vrg=2019111201&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191115&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D1%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D831c33358ecbd0f2ccffa910b98a4397%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1573857464&dt=1573857464997&dlt=1573857464563&idt=399&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1428895410&uci=3&ifi=4&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=72&icsg=52836699206200&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 82b0ce1e4e065950cc38896e1ca39abec1fdaea46823fd88394c24f0c987be11
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
3 KB
2 KB
|
267ms
267ms
|
XHR
text/plain |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3992682346307461&correlator=3722306851540671&output=ldjh&impl=fif&adsid=NT&eid=21064169&vrg=2019111201&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191115&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=1x1&ists=1&scp=as%3Dout_of_page%26adslot%3Dout_of_page%26pc%3D1%26af%3Dtickerad&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D1%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D831c33358ecbd0f2ccffa910b98a4397%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1573857465&dt=1573857465002&dlt=1573857464563&idt=399&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2540211652&uci=4&ifi=5&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=72&icsg=52836699206200&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x0&msz=1x1&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&fws=128&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 22628e59246bc809fbe231771381a62905ea6c689cf15d95125a5a75906a11ef
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
23ms
8ms
|
Script
text/javascript |
2001:4de0:ac19::1:b:2a
Highwinds Network...
|
|
|
GET
H/1.1
|
200
OK
|
submit
lb67.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
13ms
1ms
|
Image
image/gif |
136.243.4.7
HETZNER-AS
|
|
General
- Full URL
- https://lb67.s400.meetrics.net/bb-mx/submit?/cgK2BIAAA/whFcBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFvzEwlFjpFhsFzvBwhF5wFhsFtnEliF1lFoyFluFylFjoFulFytBrvFz0FluFtvEusFpuFltBlyFtpF00FlsFuvBfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSS2APAAAAAAAAAOAAAAGAAAAAAAZwSS2ABRksFAQtjF+NM8SA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.7
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h215.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb67.s400.meetrics.net/
|
43 B
308 B
|
12ms
0ms
|
Image
image/gif |
136.243.4.7
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
nuggad
ih.adscale.de/
|
49 B
487 B
|
18ms
7ms
|
Image
image/gif |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
0
376 B
|
18ms
18ms
|
Script
text/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n29=1&n121=1&n116=0&n104=1&n15=1&n155=1&n133=1&n106=1&n153=0&n11=2&n120=3&n154=1&n125=0&n8=1&n2=3&n137=0&n101=0&n108=1&n54=0&n110=0&n87=0&n149=0&n76=1&n66=0&n139=0&n160=0&n28=2&n107=0&n117=3&n86=0&n147=4&n64=0&n119=6&n22=1&n18=1&n161=1&n126=1&n92=2&n77=0&n83=0&n102=0&n105=0&n159=1&n20=1&n80=1&n12=1&n141=0&n157=0&n99=0&n128=1&n118=4&n85=0&n9=3&n6=2&n63=0&n138=0&n140=0&n94=2&n111=0&n136=0&n79=1&n93=4&n90=1&n43=1&n55=1&n142=0&n7=1&n103=0&n158=1&n124=1&n75=0&n91=0&n114=1&n69=0&n47=1&n10=2&n3=1&n82=1&n33=1&n84=1&n5=3&n48=1&n109=0&n122=1&n132=3&n67=1&n115=1&n89=1&n123=2&n17=1&n78=0&n41=1&n81=0&n88=1&n39=1&n156=1&n148=0
- Requested by
- Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
5 KB
1 KB
|
18ms
18ms
|
Stylesheet
text/css |
2606:4700:20::6819:ac0d
Cloudflare
|
|
|
POST
H2
|
200
|
bid
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
239 B
|
6ms
6ms
|
XHR
text/plain |
3.122.213.19
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
|
55 KB
13 KB
|
25ms
6ms
|
Script
text/javascript |
151.101.13.194
Fastly
|
|
|
GET
H2
|
200
|
2f569144df7e0c84ae662ad76a_ciA2NTADZGMyNjRmMDQ2YTY=.png
files.giga-video.de/da/5c/dc/
Frame A0DF
|
15 KB
15 KB
|
53ms
11ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://files.giga-video.de/da/5c/dc/2f569144df7e0c84ae662ad76a_ciA2NTADZGMyNjRmMDQ2YTY=.png
- Requested by
- Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 69f049c8296fa63b9a344f13a405b4f6e58432556da4b3e202af9788dae100ea
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
12 KB
5 KB
|
158ms
157ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=23%3A37%3A45.143<i=deflated&data=%7B%22id%22%3A511%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1573857465137%2C%22cv%22%3A%2220191112-12-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A3474%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-t2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22cd%22%3A2791.3125%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191112-12-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 04a2ed057d9eeaf1414748f8ba8dedc4f83438cefb37081a334f70b0be931071
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
109 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=2006343101%20--%20Das%20solltest%20du%20%C3%BCber%20PayPal%20wissen%5Bvideojs%2F7.6.5%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd9=20160501&cd11=2006343101&cd12=SELF&cd13=70&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.5&cd44=1&cm1=1&z=175522394
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
BLOB
|
200
OK
|
bf90bb80-9a6f-436c-927d-b77c01e7c709
https://videos.giga.de/
Frame A0DF
|
31 B
0
|
|
Other
application/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame A0DF
|
53 B
642 B
|
30ms
11ms
|
XHR
application/json |
52.219.73.163
Amazon.com
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame A0DF
|
265 B
436 B
|
6ms
6ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame F641
Redirect Chain
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
|
0
0
|
192ms
192ms
|
Document
text/html |
52.94.218.7
Amazon.com
|
|
General
- Full URL
- https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.94.218.7
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
|
GET
H/1.1
|
204
No Content
|
b2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1573857465188&ns_c=UTF-8&cv=3.1&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga....
-
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1573857465188&ns_c=UTF-8&cv=3.1&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga...
|
0
248 B
|
12ms
12ms
|
Image
text/plain |
2.16.31.65
Akamai Technologies
|
|
General
- Full URL
- https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1573857465188&ns_c=UTF-8&cv=3.1&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&c9=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.16.31.65
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-16-31-65.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame A0DF
|
653 B
1 KB
|
58ms
7ms
|
XHR
application/json |
13.224.196.120
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
1ms
1ms
|
Image
image/png |
188.40.16.106
HETZNER-AS
|
|
General
- Full URL
- https://gocp.stroeermediabrands.de/t.png?title=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&contentPieceId=2762322&publishDate=2016-05-25T18%3A29%3A51%2B02%3A00&_=1573857465202.-1238619670
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.16.106
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.106.16.40.188.clients.your-server.de
- Software
-
/
- Resource Hash
- ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/201911121507/
|
29 KB
11 KB
|
5ms
5ms
|
Script
application/javascript |
151.101.13.194
Fastly
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/201911121507/wrap.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.13.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- a0166fe46c8c973fc2b03e65ebe5b1cc43cadffa32c64388dbb0c99a0eb26def
|
GET
H2
|
200
|
/
d.agkn.com/iframe/8613/
Frame 5850
|
0
0
|
21ms
9ms
|
Document
text/html |
2600:9000:21f3:3800:19:fc2c:a140:93a1
Amazon.com
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=413231862&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
- Requested by
- Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2600:9000:21f3:3800:19:fc2c:a140:93a1
, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
16ms
16ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
9 KB
2 KB
|
19ms
19ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
POST
H/1.1
|
200
OK
|
native
Show response
native.adscale.de/
|
157 B
603 B
|
65ms
42ms
|
XHR
application/json |
95.100.66.110
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame A0DF
|
195 KB
57 KB
|
6ms
6ms
|
XHR
application/javascript |
13.224.196.120
Amazon.com
|
|
|
GET
H2
|
200
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame 90C3
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst_D1ShoprrZuLPkLMF9VD9b2Go9jPujog8sGpGccTXL0Ge1oXmWWBzsVrVrNZXBX8rcUdT3AjLs0qETR4rL5Ai-Y3k-fHBCcC_Rxn2yrS5JkAvbhz3vDNxZzDPbA1UWA8KOsOlDkdRP...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
343 B
|
23ms
6ms
|
Image
image/gif |
2a02:26f0:6c00:2bc::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 1D34
|
0
65 B
|
15ms
15ms
|
Fetch
image/gif |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstw9wry5MD1fOLngaB8FhbjXjHc8oraHQaVNPYzg-OKthgPVPdjxQxjTPychOfAEYabefHDXtr4VXkvxRe-Z5V5s16DU_wVmXvWejIkCKhoUL1MUspOYCRD576Oc6NIeu9YuYph1ROoImdnOOsWXWYwJFnc05eIq8oC7YkRDPrCh_F09tjpO38e4oZ2H2iAefHMgM2O8btaqtqhi_i-VH-u3CAkrZkHhA-o6uzmGVjsNMYQNdAbuIL_L2GjOVU2Gop_4vwai9rDZwsI2mD9TaR0YQ&sig=Cg0ArKJSzFqMXPyZNrhIEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
[PROD]_BillboardExt.min.js
Show response
templates.stroeerdigital.de/
|
2 KB
1 KB
|
73ms
26ms
|
Script
application/javascript |
13.225.78.37
Amazon.com
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 1D34
|
77 KB
29 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:817::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e55d4c6befec7b38f6bbbfbf4a6d821e1894b125814cb2b86eae646f98076e12
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame A0DF
|
195 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
userconnect.js
Show response
js.adscale.de/
|
13 KB
5 KB
|
18ms
5ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
0
Show response
d.nativendo.de/cds/delivery/render/553cq96o/182yo/60y68/8nyf4/
|
3 KB
1 KB
|
15ms
14ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
632d8c58-880e-4873-9f41-bad525386b77
Show response
t.nativendo.de/cds/tracking/event/
|
0
172 B
|
16ms
15ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/632d8c58-880e-4873-9f41-bad525386b77?aid=182yo&floor=NjMyZDhjNTgtODgwZS00OGQrF8WPHic2U7YqEQ&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ts=1573857465
- Requested by
- Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
107.178.241.34
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 34.241.178.107.bc.googleusercontent.com
- Software
-
Apache /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
DATA
|
200
OK
|
truncated
/
Frame 1D34
|
215 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
tb
Show response
15.taboola.com/
|
30 KB
31 KB
|
34ms
19ms
|
Script
text/html |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&encoded=1&uid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&variant=0|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1573857465371&tagid=&cntry=DE&platform=1&sesid=34e1cac580d3cd35ea88d3b7ea416ded&itemid=/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln&viewid=1573857465137&geolat=&geoing=&deviceifa=&appid=&sd=v2_34e1cac580d3cd35ea88d3b7ea416ded_9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39_1573857465_1573857465_CNawjgYQrMVBGLGm3InnLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA&ri=2265515e8b69ee6700198ceed0a8c128&appname=&cdb=&gdprApplies=&rid=&sii=-87077898386902071
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191112-12-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- eec9db5e24b3f9371bc50d3958500569c26db8f3a36d3c8bf5e0fb505cb80248
|
GET
H2
|
200
|
feed-card-placeholder.20191112-12-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
5 KB
2 KB
|
7ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
f89e1763-220d-4e09-ba69-9e040548fb7a.svg
cdn.taboola.com/static/f8/
|
4 KB
2 KB
|
6ms
6ms
|
Image
image/svg+xml |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
userx.20191112-12-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
22 KB
8 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
204
|
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/
Frame 7E68
Redirect Chain
-
https://rtb.mfadsrvr.com/sync?ssp=taboola
-
https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
-
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=b6c551e1-ae71-4801-9a76-1505f1bcd460
|
0
51 B
|
14ms
14ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=b6c551e1-ae71-4801-9a76-1505f1bcd460
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
204
No Content
|
sync.php
pixel.rubiconproject.com/exchange/
Frame 7E68
|
0
239 B
|
9ms
8ms
|
Image
image/gif |
69.173.144.165
The Rubicon Project
|
|
General
- Full URL
- https://pixel.rubiconproject.com/exchange/sync.php?p=16698
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_256_GCM
- Server
-
69.173.144.165
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/
Frame 7E68
Redirect Chain
-
https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D
-
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=JdgPUsHj8biOgJWQBf_QO1GabB1zY_ZjWl3C0zswM3c%3D
|
45 B
271 B
|
14ms
14ms
|
Image
image/gif |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=JdgPUsHj8biOgJWQBf_QO1GabB1zY_ZjWl3C0zswM3c%3D
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/mediamath-ssp-network/1/
Frame 7E68
Redirect Chain
-
https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]
-
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=c5875dcf-22df-4f00-9d88-34defa549765
-
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=c5875dcf-22df-4f00-9d88-34defa549765&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3Dc5875dcf-22df-4f0...
|
0
53 B
|
18ms
13ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=c5875dcf-22df-4f00-9d88-34defa549765&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3Dc5875dcf-22df-4f00-9d88-34defa549765
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
204
|
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/
Frame 7E68
Redirect Chain
-
https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%%
-
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=0Hi759cFn7ac&ev=1&pid=562107
|
0
57 B
|
14ms
14ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=0Hi759cFn7ac&ev=1&pid=562107
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame 7E68
|
43 B
691 B
|
7ms
6ms
|
Image
image/gif |
37.252.172.250
AppNexus
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/google-network/1/
Frame 7E68
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc
-
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEO1JYeLatDVBZVz-S52NC6A&google_cver=1
-
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEO1JYeLatDVBZVz-S52NC6A&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3DCAESEO1JYeLatDVBZVz-S52NC6A%26goo...
|
0
53 B
|
14ms
13ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEO1JYeLatDVBZVz-S52NC6A&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3DCAESEO1JYeLatDVBZVz-S52NC6A%26google_cver%3D1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame 7E68
|
43 B
691 B
|
14ms
6ms
|
Image
image/gif |
37.252.172.250
AppNexus
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/thetradedesk-network/1/
Frame 7E68
Redirect Chain
-
https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1
-
https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1
-
https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=00416bb9-6233-4344-a5c6-65a0787c7a34
-
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=00416bb9-6233-4344-a5c6-65a0787c7a34&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D00416bb9-6233-4344...
|
0
53 B
|
14ms
13ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=00416bb9-6233-4344-a5c6-65a0787c7a34&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D00416bb9-6233-4344-a5c6-65a0787c7a34
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/storygize-network/1/
Frame 7E68
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=1f5b313a-f830-4a37-af11-964dc6e7f647
-
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=1f5b313a-f830-4a37-af11-964dc6e7f647&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D1f5b313a-f830-4a37-af...
|
0
76 B
|
14ms
14ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=1f5b313a-f830-4a37-af11-964dc6e7f647&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D1f5b313a-f830-4a37-af11-964dc6e7f647
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
cookiesync
bttrack.com/pixel/
Frame 7E68
|
35 B
380 B
|
369ms
94ms
|
Image
image/gif |
192.132.33.46
Bidtellect Inc.
|
|
|
GET
H/1.1
|
200
OK
|
/
cds.taboola.com/
Frame 7E68
|
0
293 B
|
301ms
110ms
|
Image
text/plain |
130.211.13.252
Google LLC
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/bidswitch-network/1/
Frame 7E68
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://x.bidswitch.net/ul_cb/sync?ssp=taboola
-
https://u.ipw.metadsp.co.uk/sync?ssp=bidswitch&bidswitch_ssp_id=taboola&bsw_user_id=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&bsw_param=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&gdpr=&gdpr_consent=
-
https://x.bidswitch.net/sync?dsp_id=339&expires=14&user_group=0&user_id=&ssp=taboola&bsw_param=7cfeeee4-2fe5-4a95-9544-7953fda7eed5
-
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=7cfeeee4-2fe5-4a95-9544-7953fda7eed5
-
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D7cfeeee4-2fe5-4a95-95...
|
0
53 B
|
14ms
13ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D7cfeeee4-2fe5-4a95-9544-7953fda7eed5
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
103 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:81b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cm73=1&cm13=1&z=839075839
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
61 B
|
27ms
27ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
423 B
|
24ms
24ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
data
lb67.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.4.7
HETZNER-AS
|
|
General
- Full URL
- https://lb67.s400.meetrics.net/data?/cgK2D3EAAKktFLkqFFlqwF23A52AwwA/k0FCEmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA4xAwwAw5A1mAjwFpkF9kElzFr0FvwFmhEwhF91AyxAw2A55A03AwmAjpFk9BxzA4yA5yA2wA55A3xAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1yAxwA25A50A3wAmhEwkF91AyxAw2A55A03AwmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A1zA2yALlnFB/k0FOImvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA4xAwwAw5A1mAjwFpkF9kElzFr0FvwFmhEwhF91AyxAw2A55A03AwmAjpFk9BxzA4yA5yA2wA55A3xAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1yAxwA25A50A3wAmhEwkF91AyxAw2A55A03AwmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A1zA2yAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A10AwwAUkzFYBPQEAAAAAAABvn8APBAAFAAvn8TYeNAPAAAYGA5BABYeNAZAAAOA55A55A85B55A58E55A55AGAy0A4zAwzArYeNASksFJFjAAAAAAAAAAAAEAAAvn8AAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHA33Aw4Ey1AwBEMAxzA4yA5yA2wA55A3xAGAkpFylFj0FAAAAIAy4AxwAwwA51AKA1yAxwA25A50A3wAGAihFuuFlyFKA1yAxwA25A50A3wAKA1yAxwA25A50A3wAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdYGA5BACMA6DAFAAAYeNAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFzmB8YA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.7
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h215.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
d401ee82-93fd-4c56-b9c7-05f319e5cb25.png
c.nativendo.de/cdn/asset/media/crt/52014/2/3/
|
47 KB
47 KB
|
17ms
17ms
|
Image
image/jpeg |
2606:4700:20::6819:ac0d
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
ai.aspx
m.exactag.com/
Redirect Chain
-
https://track.adform.net/adfserve/?bn=33683028;1x1inv=1;srctype=3;ord=1573857465
-
https://track.adform.net/adfserve/?CC=1&bn=33683028;1x1inv=1;srctype=3;ord=1573857465
-
https://m.exactag.com/ai.aspx?tc=8d94023d893b6f61389437d4033a9fa0&rnd=44033
|
43 B
654 B
|
76ms
45ms
|
Image
image/gif |
85.14.248.71
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
userconnect
Show response
ih.adscale.de/
|
95 B
364 B
|
8ms
7ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
632d8c58-880e-4873-9f41-bad525386b77
Show response
t.nativendo.de/cds/tracking/event/
|
0
170 B
|
17ms
16ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
671 B
|
6ms
6ms
|
Image
image/png |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
|
GET
H2
|
200
|
creative_js.js
Show response
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
|
4 KB
2 KB
|
7ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame FE9D
|
0
0
|
9ms
8ms
|
Document
text/html |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
st
imprammp.taboola.com/
Frame AD32
|
0
0
|
15ms
13ms
|
Document
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=1D26B4B21450068731176809945&cicmp=1657475&cijs=1&dast=V7DfcCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-FushgsN4vVcrcaTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3AhabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtfDgAAAAAPAEqF_RA_gAAAEQAAAAASAAAAABQBFf8WAhcAAAAAGAAFWD8aAFAcDOe6W192o8P1edn9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1VK7VvMI7tH9EVIBYxAgAAAAAkqnN42hSJ1QWVQAABOlWAFcAAAFucTcUMlm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTYhozC0tiKWAV-0XEABg7RcQAIBN3QAA3gLggi4AVmcQk81oN5kdAAAAwN3___-_HsiMVo6Nw-MaDkaejcmzWjmMw5Fn4ls5TIvZyGXynt21hWn3nbN034iwzH7fQUE5PT1ml0HGcpkMaoGsaXL5DeKDhmE5GQTzm7DFaDWZbJbD2XIxGQxHw9FofwI3GuAEDYeDxW6w2C0Ww8liMhosBwsUiMEEJ2Q42kxWo91qN1kOJ6PRbDPZIEWrVrPRZjBczSaz3W41HAyXoxFStGYxm0wWs9FytxksJ6PBcDIcIkzuhpuZZeVc63Yj11o0G47cEodpsNaMLJOZy7McrSzDtej1MZ02xoXLs9yiYMDRXgQX6URzuvxdLstb87a4dU6fwyKWaE4W6UR22XdGK8fG4XENByPPxuRZrRzG4cgz8a0cpsVs5DL5m7vhZmZZOde63ci1Fs2GI7fEYRqsNSPLZObyLEcry3Aten1Mp41x4fIs943VbjNc7Uaz1b6x2m2Gq91ottp36Azf1edsVN60Co_MY3uWdLuZ06BwGSzen8S0mHZnB8_vd3SqVBeNsSH7JhRmg8dgUMQSwekinYhextNFLJE8LdKJZDJbrRarlXFiW65ctt1gsFgONy6XybAwbhyT4UQsUZou0ole97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtF_ceGGI3mutlcMVjONYNVAgAAAAAAAABYwpx5EwAAAIDTQBaLwWSxXAAIMdZdf-VRDm_uueTixo8h5nT5u1yWt-ZtceucPocB!&excid=22&tst=1&docw=0&cs=false
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
cmTagFEED_MANAGER.js
Show response
vidstat.taboola.com/vpaid/units/26_2_3/infra/
|
669 KB
149 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
cmOsUnit.css
vidstat.taboola.com/vpaid/units/26_2_3/assets/css/
|
34 KB
6 KB
|
7ms
6ms
|
Stylesheet
text/css |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 1CA2
|
0
57 B
|
17ms
14ms
|
Fetch
image/gif |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuGKrcVxutBQLJAxtD78sjkKmlSv3j--HwEsvauSi7JpyzY0Ht2UjYQ5wL22erPot-pQdhHn8vWx_67d9Pm-iDm0vAiB_UxIfoTBYCvN8T6LzYbY930JEwmbWWZ5a4b09VQxpKrmLdMex6lve5rMNeHvgykh9mSZQuqT2rqLFWKbtQGCKD7wDpFSiB8n3S_o9lA7bQ4W0FYBVuFILo1P6TrOrHjMR5tro_9CMERaFe-NT9v3q5OOP2rG2A-pAszgJusKtV5xHb2RPsoV1MllUH1MBBBGylop8mAEjxFeMyzzAVazFQ7-FrZKAc&sig=Cg0ArKJSzBsoDSHIqPJBEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
dcmads.js
Show response
fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754022/dcm/
Frame 1CA2
|
197 KB
67 KB
|
93ms
54ms
|
Script
application/javascript |
199.166.0.24
Integral Ad Science
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 1CA2
|
77 KB
29 KB
|
15ms
13ms
|
Script
text/javascript |
2a00:1450:4001:817::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e55d4c6befec7b38f6bbbfbf4a6d821e1894b125814cb2b86eae646f98076e12
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
632d8c58-880e-4873-9f41-bad525386b77
Show response
t.nativendo.de/cds/tracking/event/
|
0
170 B
|
16ms
15ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
skeleton.js
Show response
static.adsafeprotected.com/
Frame 1CA2
Redirect Chain
-
https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754022/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online...
-
https://static.adsafeprotected.com/skeleton.js
|
17 B
299 B
|
13ms
12ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H/1.1
|
200
OK
|
sca.17.4.95.js
Show response
static.adsafeprotected.com/
Frame A016
|
81 KB
20 KB
|
76ms
36ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame A60D
|
0
57 B
|
16ms
14ms
|
Fetch
image/gif |
172.217.23.98
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuThGaecvm-iyVBxO-20HDJAZIozAyRsoc6xY1N3xM7Pp-sr930p2RCUpbm94hme6QZOwqrq0o1UT9Jg4nwkEGwkFZoqQbeBfqDBhiI_bbboOApaSNBe1IS3PkvM2NJXE3-lyX91EiRJHTX_3kZpGVK6RRl_URl8jxbUe0YLcL_UZxzjpyEbiZd3DMkWe60HySoDYkxr89LUdI7qud9lIyRK1bOv8SDCKjhOkERC6ujAqqx7n880WNyJZOl-6o-UzY8oINN5sXljY0ulfwkSF-orU60oWfBlSeSShChoDmsZR_s2Nlqfjyqz8c&sig=Cg0ArKJSzMIEJEOfUYXvEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.23.98
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s45-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
dcmads.js
Show response
fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/
Frame A60D
|
197 KB
67 KB
|
75ms
56ms
|
Script
application/javascript |
199.166.0.24
Integral Ad Science
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame A60D
|
77 KB
29 KB
|
16ms
13ms
|
Script
text/javascript |
2a00:1450:4001:817::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111201.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- e55d4c6befec7b38f6bbbfbf4a6d821e1894b125814cb2b86eae646f98076e12
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame A0DF
|
53 B
642 B
|
9ms
9ms
|
XHR
application/json |
52.219.73.163
Amazon.com
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=3340776473
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.73.163
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- s3.eu-central-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame A0DF
|
265 B
436 B
|
6ms
6ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=4072952720
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
109.71.25.30
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
256ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=4ab0d7a7-cb9b-4c17-f3b6-646d458a0632&tv={c:u5a46O,pingTime:-2,time:60,type:a,im:{sf:0,pom:1,prf:{mdA:3,mdZ:100,beA:105,beZ:106,mfA:108,cmA:108,inA:108,inZ:113,prA:113,prZ:118,si:123,poA:124,poZ:129,cmZ:129,mfZ:129,loA:150,loZ:151,ltA:164,ltZ:164}},sca:{dfp:{df:4,sz:160.600,dom:ins}},env:{gca:0},clog:[{piv:100,vs:i,r:,w:160,h:600,t:18}],es:0,sc:1,ha:1,gm:0,slTimes:{i:60,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1318.121.160.600,am:i,cc:1318.121.160.600,piv:100,obst:0,th:0,reas:,bkn:{piv:[54~100],as:[54~160.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754022,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0,slid:[google_ads_iframe_4444/giga.de_sd/software_artikel_1,google_ads_iframe_4444/giga.de_sd/software_artikel_1__container__,sdgAdServerContainer-sky,sky-2],sinceFw:41,readyFired:true}&br=u
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame A0DF
|
653 B
1 KB
|
6ms
6ms
|
XHR
application/json |
13.224.196.120
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=2173410616
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.224.196.120
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-13-224-196-120.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/d94290f2d3dc976b246a0b279f4a216c0d432e1d/
Frame A0DF
|
653 B
1 KB
|
88ms
49ms
|
XHR
application/json |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/d94290f2d3dc976b246a0b279f4a216c0d432e1d/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
5.9.139.135
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.135.139.9.5.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- 5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
|
GET
DATA
|
200
OK
|
truncated
/
Frame 1CA2
|
213 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb67.s400.meetrics.net/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
136.243.4.7
HETZNER-AS
|
|
General
- Full URL
- https://lb67.s400.meetrics.net/data?/cgK2EzKAALlnFCUkzFFCPlAAAAAAAABwkxAPBAAFAAwkxThRjAPAAAAAANDBBhRjAZAAAOA55A55A85B55A58E55A55AGAywAzwA12ArhRjAPFAAYGA5BAHYeNAPAAAAAANDBHhRjAP5EAAAAtGBKhRjASksFbFjAAAAAAAAAAAAEAAAwkxAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0fFvmFfwFhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0fFvmFfwFhnFlBFdAAANDBxYAAAAFAAAhRjAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFBUS0SA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.7
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h215.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
skeleton.js
Show response
static.adsafeprotected.com/
Frame A60D
Redirect Chain
-
https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754020/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online...
-
https://static.adsafeprotected.com/skeleton.js
|
17 B
299 B
|
13ms
13ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H/1.1
|
200
OK
|
sca.17.4.95.js
Show response
static.adsafeprotected.com/
Frame 2AC6
|
81 KB
20 KB
|
12ms
12ms
|
Script
application/javascript |
199.166.0.32
Integral Ad Science
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame A0DF
|
24 B
409 B
|
55ms
1ms
|
XHR
application/octet-stream |
148.251.51.163
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.51.163
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.163.51.251.148.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 7651
|
241 B
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
161ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=301f1fa4-5802-8636-9560-d9f5832ac8bf&tv={c:u5a49J,pingTime:-2,time:95,type:a,im:{sf:0,pom:1,prf:{mdA:3,mdZ:79,beA:119,beZ:120,mfA:121,cmA:122,inA:122,inZ:126,prA:126,prZ:131,si:136,poA:137,poZ:166,cmZ:166,mfZ:166,loA:179,loZ:180,ltA:213,ltZ:213}},sca:{dfp:{df:4,sz:300.250,dom:ins}},env:{gca:0},clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:95,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:16,wc:0.0.1600.1200,ac:968.438.300.250,am:i,cc:968.438.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[90~100],as:[90~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g.346702-39754022|1g1|1h*.346702-39754020,idMap:1h*,rend:0,renddet:WINDOW,rmeas:0,slid:[google_ads_iframe_4444/giga.de_sd/software_artikel_2,google_ads_iframe_4444/giga.de_sd/software_artikel_2__container__,sdgAdServerContainer-rectangle,rectangle-3],sinceFw:76,readyFired:true}&br=u
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H2
|
200
|
publishertag.prebid.js
Show response
static.criteo.net/js/ld/
|
42 KB
14 KB
|
46ms
16ms
|
Script
text/javascript |
178.250.0.130
ASN-CRITEO-EUROPE
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame A60D
|
213 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb67.s400.meetrics.net/
|
43 B
308 B
|
1ms
0ms
|
Image
image/gif |
136.243.4.7
HETZNER-AS
|
|
General
- Full URL
- https://lb67.s400.meetrics.net/data?/cgK2F0MAA/k0FPMmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA4xAwwAw5A1mAjwFpkF9kElzFr0FvwFmhEwhF91AyxAw2A55A03AwmAjpFk9BxzA4yA5yA2wA55A3xAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1yAxwA25A50A3wAmhEwkF91AyxAw2A55A03AwmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A1zA2yAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A10AwwAmvFytFh0FjvFklF9TEr5FzjFyhFwlFyfFx2AwmAhkF29By4A01AwzA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA54Ay3Ax1A1yAmjEpkF9xAz4Ay5AxyAw0Ay0A0mAzpF6lF9xA2wA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B1xA54Ay3Ax1A1yAmhEwkF91Ax5A4yA3xA11AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zA41A30A21A34AxBELlnFDUkzFYBP9AAAAAAAABb9HAPBAAFAAb9HTbosAPAAAmUA5BABbosAZAAAOA55A55A85B55A58E55A55AFAzyA2wAzBErbosASksFJFjAAAAAAAAAAAAEAAAb9HAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAx2Aw4E2wAwBEMAxzA4yA5xAywA0yA00AGAkpFylFj0FAAAAIAy4A01AwzA31AKA1xA54Ay3Ax1A1yADAzrF5BFKA1xA54Ay3Ax1A1yAKA1xA54Ay3Ax1A1yAtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdmUA5BAgCAYJAFAAAbosAAAAAOATrF5zFjyFhwFlyFfxB2wAAAAAAAAAAAAAAAAAQtjFfEWsYA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.7
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h215.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb67.s400.meetrics.net/
|
43 B
308 B
|
1ms
1ms
|
Image
image/gif |
136.243.4.7
HETZNER-AS
|
|
General
- Full URL
- https://lb67.s400.meetrics.net/data?/cgK2G1MAA/k0FdQmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA4xAwwAw5A1mAjwFpkF9kElzFr0FvwFmhEwhF91AyxAw2A55A03AwmAjpFk9BxzA4yA5yA2wA55A3xAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1yAxwA25A50A3wAmhEwkF91AyxAw2A55A03AwmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A1zA2yAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A10AwwAmvFytFh0FjvFklF9TEr5FzjFyhFwlFyfFx2AwmAhkF29By4A01AwzA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA54Ay3Ax1A1yAmjEpkF9xAz4Ay5AxyAw0Ay0A0mAzpF6lF9xA2wA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B1xA54Ay3Ax1A1yAmhEwkF91Ax5A4yA3xA11AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zA41A30A21A34AxmEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29By4A01AwzA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA54Ay3Ax1A1yAmjEpkF9xAz4Ay5Aw4AzzAx4A1mAzpF6lF9zAwwA4yB1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA54Ay3Ax1A1yAmhEwkF91Ax5A4yA3xA11AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zA41A30A21A5xAwBELlnFETkzFARksFAQtjF1u9zYA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.7
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h215.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.giga.de/ef025392ac8785d37010db2d0fb8cf35a0b9e78a/
Frame A0DF
|
109 B
671 B
|
15ms
4ms
|
XHR
application/json |
5.9.139.135
HETZNER-AS
|
|
General
- Full URL
- https://ssl.2.damoh.giga.de/ef025392ac8785d37010db2d0fb8cf35a0b9e78a/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
5.9.139.135
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.135.139.9.5.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
85ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=4ab0d7a7-cb9b-4c17-f3b6-646d458a0632&tv={c:u5a4cr,pingTime:-10,time:409,type:s,mvn:ZnNjPTEyLHNkPTMsbm89Nyxhc3A9MQ--,fsc:17.4.95v220002022020220000022002222000022220202020222220222220002222022002222200002220222022222222222000220200000022220222220222222222222202222222222222222222222222222222222222200000022022020020000002002202022022022222222000000000020222202022022222000000020000000000000000000002220002220000022200222202220022200200222022202220022222220020222222000220000222202222202222000002002002222222222220022202200022002220222202,sd:MTcuNC45NXYxMjAwfHwxNjAwfHwxfHwxfHwyNHx8MTIwMHx8MHx8MHx8MXx8bGFuZHNjYXBlLXByaW1hcnl8fDI0fHw0LzN8fDQvM3x8MHx8MTYwMA--,no:MTcuNC45NXZNb3ppbGxhfHxOZXRzY2FwZXx8bnx8MTZ8fG58fDB8fG58fExpbnV4IHg4Nl82NHx8R2Vja298fDIwMDMwMTA3fHwtNjB8fE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE0XzUpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NC4wLjM3MjkuMTY5IFNhZmFyaS81MzcuMzZ8fDF8fDF8fEdvb2dsZSBJbmMufHxu,asp:1573857466066||c96d00348236040a4b471abcee9e99d1||675c74d5f114ba25a49fb0f4cb02f70f||f392730a505a5a1096aa7eeed39422b3||23a1e94404c2ea615da1fb1e39ec2d9b||582a2258a03c404cff9a17f5afaa31eb||61bd4fcf33d02f0ae1070ad212ba3ce1||008f10441d9746584359b8fdb0db8957||1529428597}
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H2
|
200
|
/
Show response
track.adform.net/Serving/Cookie/
|
92 B
469 B
|
21ms
21ms
|
Script
text/javascript |
37.157.4.23
ADFORM
|
|
|
GET
H2
|
200
|
f9b17833-d68c-4e4d-b319-d6061d45aa9f
Show response
boot.pubstack.io/v1/tag/
|
1 KB
826 B
|
91ms
31ms
|
Script
application/javascript |
52.214.103.10
Amazon.com
|
|
|
GET
H2
|
200
|
content14_10_18m.js
Show response
vidstat.taboola.com/
|
37 KB
8 KB
|
6ms
5ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
oppsula.js
Show response
vidstat.taboola.com/oppsula/1.3.6/
|
15 KB
5 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
OvaMediaPlayer.js
Show response
vidstat.taboola.com/vpaid/vPlayer/player/v10.5.1/
|
678 KB
180 KB
|
6ms
6ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
sync
match.taboola.com/
Frame F2CA
|
0
0
|
16ms
14ms
|
Document
text/html |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sync?dast=V7DfcCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-FushgsN4vVcrcaTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3AhabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtfDgAAAAAPAEqF_RA_gAAAEQAAAAASAAAAABQBFf8WAhcAAAAAGAAFWD8aAFAcDOe6W192o8P1edn9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1VK7VvMI7tH9EVIBYxAgAAAAAkqnN42hSJ1QWVQAABOlWAFcAAAFucTcUMlm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTYhozC0tiKWAV-0XEABg7RcQAIBN3QAA3gLggi4AVmcQk81oN5kdAAAAwN3___-_HsiMVo6Nw-MaDkaejcmzWjmMw5Fn4ls5TIvZyGXynt21hWn3nbN034iwzH7fQUE5PT1ml0HGcpkMaoGsaXL5DeKDhmE5GQTzm7DFaDWZbJbD2XIxGQxHw9FofwI3GuAEDYeDxW6w2C0Ww8liMhosBwsUiMEEJ2Q42kxWo91qN1kOJ6PRbDPZIEWrVrPRZjBczSaz3W41HAyXoxFStGYxm0wWs9FytxksJ6PBcDIcIkzuhpuZZeVc63Yj11o0G47cEodpsNaMLJOZy7McrSzDtej1MZ02xoXLs9yiYMDRXgQX6URzuvxdLstb87a4dU6fwyKWaE4W6UR22XdGK8fG4XENByPPxuRZrRzG4cgz8a0cpsVs5DL5m7vhZmZZOde63ci1Fs2GI7fEYRqsNSPLZObyLEcry3Aten1Mp41x4fIs943VbjNc7Uaz1b6x2m2Gq91ottp36Azf1edsVN60Co_MY3uWdLuZ06BwGSzen8S0mHZnB8_vd3SqVBeNsSH7JhRmg8dgUMQSwekinYhextNFLJE8LdKJZDJbrRarlXFiW65ctt1gsFgONy6XybAwbhyT4UQsUZou0ole97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtF_ceGGI3mutlcMVjONYNVAgAAAAAAAABYwpx5EwAAAIDTQBaLwWSxXAAIMdZdf-VRDm_uueTixo8h5nT5u1yWt-ZtceucPocB!&excid=22&docw=0&cijs=1
- Requested by
- Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/26_2_3/infra/cmTagFEED_MANAGER.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
52 B
|
19ms
14ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7GloCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-Fus1jsZsPBcjlaDWEjRpTZhDShLEarwWA23E0Wg-VmsVruVoMphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G7jQdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08ts98sBAAAA4AFAqbAf4gcQACACAAAAQAIAAACAIqDi30LgAgAAAAADoADrRwMAioPhXHfry250uD4vuz8AAB4CQAAABhRIAAZwmkoAKnIOTgAAAAAAAAAAWP7___9jAPSIz2QAMpQGewAefAAeiAoQixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDALe6GQiYMAACAYGyBHha_3-ywa_xulwEAAAAAAAAAmP2f_aMJEY25pQWxFPCq_QICAKz9AgIAsKkbAMBbAFzQBcDqDGKyGe0mswMAAAC4-____9cDmdHKsXF4XMPByLMxeVYrh3E48kx8K4dpMRu5TN6zu7Yw7b5zlu4bEZbZ7zsoKKenx-wyyFguk0EtkDVNLr9BfNAwLCeDYH4TthitJpPNcjhbLiaD4Wg4Gu1P4EYDnKDhcLDYDRa7xWI4WUxGg-VggQIxmOCEDEebyWq0W-0my-FkNJptJhukaNVqNtoMhqvZZLbbrYaD4XI0QorWLGaTyWI2Wu42g-VkNBhOhkOEyd1wM7OsnGvdbuRai2bDkVviMA3WmpFlMnN5lqOVZbgWvT6m08a4cHmWWxQMONqL4CKdaE6Xv8tleWveFrfO6XNYxBLNySKdyC77zmjl2Dg8ruFg5NmYPKuVwzgceSa-lcO0mI1cJn9zN9zMLCvnWrcbudai2XDkljhMg7VmZJnMXJ7laGUZrkWvj-m0MS5cnuW-sdpthqvdaLbaN1a7zXC1G81W-w6d4bv6nI3Km1bhkXlsz5JuN3MaFC6DxfuTmBbT7uzg-f2OTpXqojE2ZN-EwmzwGAyKWCI4XaQT0ct4uoglkqdFOpFMZqvVYrUyTmzLlcu2GwwWy-HG5TIZFsaNYzKciCVK00U60eteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08tst6j_2BCj0Vw3mysGy7lmsEoAAAAAAAAAAEuYM28CAAAAcBrIYjGYLJYLACHGuuuvPMrhzT2XXNz4McScLn-Xy_LWvC1undPnMA!&cmcv=&pix=31589837&cb=1573857466193&uv=2623&tms=1573857466193&abt=expl_vA!gdpr_vB!rvf1_vA!ufm_vE&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1573857464364.1023!ts:1573857466193&
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
53 B
|
18ms
14ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7GloCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-Fus1jsZsPBcjlaDWEjRpTZhDShLEarwWA23E0Wg-VmsVruVoMphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G7jQdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08ts98sBAAAA4AFAqbAf4gcQACACAAAAQAIAAACAIqDi30LgAgAAAAADoADrRwMAioPhXHfry250uD4vuz8AAB4CQAAABhRIAAZwmkoAKnIOTgAAAAAAAAAAWP7___9jAPSIz2QAMpQGewAefAAeiAoQixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDALe6GQiYMAACAYGyBHha_3-ywa_xulwEAAAAAAAAAmP2f_aMJEY25pQWxFPCq_QICAKz9AgIAsKkbAMBbAFzQBcDqDGKyGe0mswMAAAC4-____9cDmdHKsXF4XMPByLMxeVYrh3E48kx8K4dpMRu5TN6zu7Yw7b5zlu4bEZbZ7zsoKKenx-wyyFguk0EtkDVNLr9BfNAwLCeDYH4TthitJpPNcjhbLiaD4Wg4Gu1P4EYDnKDhcLDYDRa7xWI4WUxGg-VggQIxmOCEDEebyWq0W-0my-FkNJptJhukaNVqNtoMhqvZZLbbrYaD4XI0QorWLGaTyWI2Wu42g-VkNBhOhkOEyd1wM7OsnGvdbuRai2bDkVviMA3WmpFlMnN5lqOVZbgWvT6m08a4cHmWWxQMONqL4CKdaE6Xv8tleWveFrfO6XNYxBLNySKdyC77zmjl2Dg8ruFg5NmYPKuVwzgceSa-lcO0mI1cJn9zN9zMLCvnWrcbudai2XDkljhMg7VmZJnMXJ7laGUZrkWvj-m0MS5cnuW-sdpthqvdaLbaN1a7zXC1G81W-w6d4bv6nI3Km1bhkXlsz5JuN3MaFC6DxfuTmBbT7uzg-f2OTpXqojE2ZN-EwmzwGAyKWCI4XaQT0ct4uoglkqdFOpFMZqvVYrUyTmzLlcu2GwwWy-HG5TIZFsaNYzKciCVK00U60eteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08tst6j_2BCj0Vw3mysGy7lmsEoAAAAAAAAAAEuYM28CAAAAcBrIYjGYLJYLACHGuuuvPMrhzT2XXNz4McScLn-Xy_LWvC1undPnMA!&cmcv=&pix=&cb=1573857466213&uv=2623&tms=1573857466213&abt=expl_vA!gdpr_vB!rvf1_vA!ufm_vE&ft=0&unm=FEED_MANAGER
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
cx.atdmt.com/
Redirect Chain
-
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
-
https://cx.atdmt.com/?c=11802502823519460259&f=AYyr4j2mdI5Ao6QbLsA8cYFTS9wl806bKsjTLwpn0NhllUOT0IAEbTg0MESGF8vLQKrPYvFgyUvHJZu9M4JonFO_&id=1773162896260346&l=3&v=0
|
42 B
406 B
|
52ms
39ms
|
Image
image/gif |
2a03:2880:f01c:8004:face:b00c:0:8c
Facebook
|
|
|
GET
BLOB
|
206
Partial Content
|
6801aee8-b7e8-4679-8728-0de0c2373375
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
BLOB
|
206
Partial Content
|
ec2f6fa4-eec8-427d-be64-098ff861b272
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
6ms
5ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
43ms
9ms
|
Script
application/javascript |
89.163.159.100
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1014 B
|
93ms
21ms
|
Script
application/javascript |
194.213.222.30
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
92ms
30ms
|
Script
text/javascript |
52.208.73.164
Amazon.com
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
496 B
|
31ms
17ms
|
Image
image/gif |
35.186.238.175
Google LLC
|
|
|
GET
H/1.1
|
200
|
match
pixel.consentric.de/tp/
|
43 B
354 B
|
40ms
11ms
|
Image
image/gif |
62.138.221.190
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
monitoring.js
Show response
cdn.prod.pubstack.io/
|
61 KB
19 KB
|
20ms
6ms
|
XHR
application/javascript |
34.95.76.218
Google LLC
|
|
|
GET
H2
|
200
|
player.css
vidstat.taboola.com/vpaid/vPlayer/player/v10.5.1/assets/
|
14 KB
3 KB
|
6ms
5ms
|
Stylesheet
text/css |
151.101.14.2
Fastly
|
|
|
POST
H2
|
200
|
player_options
Show response
vidanalytics.taboola.com/putes/
|
2 B
59 B
|
133ms
115ms
|
XHR
text/plain |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
53 B
|
14ms
14ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=81&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7GloCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-Fus1jsZsPBcjlaDWEjRpTZhDShLEarwWA23E0Wg-VmsVruVoMphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G7jQdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08ts98sBAAAA4AFAqbAf4gcQACACAAAAQAIAAACAIqDi30LgAgAAAAADoADrRwMAioPhXHfry250uD4vuz8AAB4CQAAABhRIAAZwmkoAKnIOTgAAAAAAAAAAWP7___9jAPSIz2QAMpQGewAefAAeiAoQixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDALe6GQiYMAACAYGyBHha_3-ywa_xulwEAAAAAAAAAmP2f_aMJEY25pQWxFPCq_QICAKz9AgIAsKkbAMBbAFzQBcDqDGKyGe0mswMAAAC4-____9cDmdHKsXF4XMPByLMxeVYrh3E48kx8K4dpMRu5TN6zu7Yw7b5zlu4bEZbZ7zsoKKenx-wyyFguk0EtkDVNLr9BfNAwLCeDYH4TthitJpPNcjhbLiaD4Wg4Gu1P4EYDnKDhcLDYDRa7xWI4WUxGg-VggQIxmOCEDEebyWq0W-0my-FkNJptJhukaNVqNtoMhqvZZLbbrYaD4XI0QorWLGaTyWI2Wu42g-VkNBhOhkOEyd1wM7OsnGvdbuRai2bDkVviMA3WmpFlMnN5lqOVZbgWvT6m08a4cHmWWxQMONqL4CKdaE6Xv8tleWveFrfO6XNYxBLNySKdyC77zmjl2Dg8ruFg5NmYPKuVwzgceSa-lcO0mI1cJn9zN9zMLCvnWrcbudai2XDkljhMg7VmZJnMXJ7laGUZrkWvj-m0MS5cnuW-sdpthqvdaLbaN1a7zXC1G81W-w6d4bv6nI3Km1bhkXlsz5JuN3MaFC6DxfuTmBbT7uzg-f2OTpXqojE2ZN-EwmzwGAyKWCI4XaQT0ct4uoglkqdFOpFMZqvVYrUyTmzLlcu2GwwWy-HG5TIZFsaNYzKciCVK00U60eteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08tst6j_2BCj0Vw3mysGy7lmsEoAAAAAAAAAAEuYM28CAAAAcBrIYjGYLJYLACHGuuuvPMrhzT2XXNz4McScLn-Xy_LWvC1undPnMA!&cmcv=&uv=2623&unm=FEED_MANAGER&cb=1573857466285&abt=expl_vA!gdpr_vB!rvf1_vA!ufm_vE&baseReportD=taboola.com&dataCenter=am&
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
POST
H2
|
200
|
player_options
Show response
vidanalytics.taboola.com/putes/
|
2 B
219 B
|
72ms
62ms
|
XHR
text/plain |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
5210699470
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
22ms
7ms
|
XHR
application/json |
52.29.86.7
Amazon.com
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
36ms
12ms
|
Script
text/plain |
89.163.159.123
MYLOC-AS
|
|
General
- Full URL
- https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
- Requested by
- Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
89.163.159.123
Cloppenburg, Germany,
ASN24961
(MYLOC-AS, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.18/
|
5 KB
2 KB
|
23ms
7ms
|
Script
application/javascript |
2600:9000:20eb:ee00:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
31ms
31ms
|
Script
text/javascript |
52.208.73.164
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=831c33358ecbd0f2ccffa910b98a4397&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=794604475324
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.208.73.164
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- 83d4f5c4e13bb515a0ce09094f5d4c19f6ecd174a00086021a510717ff37b0d2
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
123ms
31ms
|
Script
application/javascript |
63.34.92.224
Amazon.com
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame C331
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBsJ0Ws_CWD_ABiUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4209665556643396968
|
42 B
662 B
|
31ms
30ms
|
Image
image/gif |
52.208.73.164
Amazon.com
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 1D34
|
42 B
110 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:820::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsultlrkRoNHAzF1rzhCGD8Ll7SO66jNkpT1vs1uZCjpxh_5_qnacuSsSsd9Q9zBapH7leG9b9fUa6_Nb1dFq3K1I9Jrf1iRTLikTLSXcqY&sig=Cg0ArKJSzI5UedKnLwC1EAE&adk=2257154448&tt=-1&bs=1585%2C1200&mtos=1009,1009,1009,1009,1009&tos=1009,0,0,0,0&p=121,408,371,1178&cm=1&mcvt=1009&rs=0&ht=0&tfs=109&tls=1118&mc=1<e=1&bas=0&bac=0&met=ce&avms=nio&exg=1&md=2&lm=2&rst=1573857465284&dlt&rpt=81&isd=0&msd=0&ext&imams=1&xdi=0&ps=1585%2C4569&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-5-10-4-9-9-0-0-0&tvt=1115&is=770%2C250&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&r=v&id=osdim&vs=4&uc=10&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191113
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame DF15
|
0
0
|
126ms
33ms
|
Document
text/html |
34.248.95.73
Amazon.com
|
|
|
POST
H2
|
204
|
error
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
31ms
30ms
|
XHR
text/plain |
52.208.125.71
Amazon.com
|
|
|
POST
H2
|
204
|
auction
Show response
intake.prod.pubstack.io/v1/intake/
|
0
57 B
|
31ms
31ms
|
XHR
text/plain |
52.208.125.71
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
252ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=4ab0d7a7-cb9b-4c17-f3b6-646d458a0632&tv={c:u5a4mI,pingTime:1,time:1046,type:p,clog:[{piv:100,vs:i,r:,w:160,h:600,t:18}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1046,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1318.121.160.600,am:i,cc:1318.121.160.600,piv:100,obst:0,th:0,reas:,bkn:{piv:[1040~100],as:[1040~160.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:86,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754022|1h.346702-39754020,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
253ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=4ab0d7a7-cb9b-4c17-f3b6-646d458a0632&tv={c:u5a4mI,pingTime:1,time:1046,type:c,clog:[{piv:100,vs:i,r:,w:160,h:600,t:18}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1046,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1318.121.160.600,am:i,cc:1318.121.160.600,piv:100,obst:0,th:0,reas:,bkn:{piv:[1040~100],as:[1040~160.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:86,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754022|1h.346702-39754020,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0,metricId:forwrd1}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
175ms
84ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=301f1fa4-5802-8636-9560-d9f5832ac8bf&tv={c:u5a4pj,pingTime:1,time:1061,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1061,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:16,wc:0.0.1600.1200,ac:968.438.300.250,am:i,cc:968.438.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1056~100],as:[1056~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:174,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g.346702-39754022|1g1|1h*.346702-39754020,idMap:1h*,rend:0,renddet:WINDOW,rmeas:0}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
176ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=301f1fa4-5802-8636-9560-d9f5832ac8bf&tv={c:u5a4pk,pingTime:1,time:1062,type:c,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1062,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:16,wc:0.0.1600.1200,ac:968.438.300.250,am:i,cc:968.438.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1057~100],as:[1057~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:174,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g.346702-39754022|1g1|1h*.346702-39754020,idMap:1h*,rend:0,renddet:WINDOW,rmeas:0,metricId:forwrd1}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
662 B
|
30ms
30ms
|
Image
image/gif |
52.208.73.164
Amazon.com
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 1CA2
|
42 B
110 B
|
15ms
14ms
|
Image
image/gif |
2a00:1450:4001:820::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstkNMS1BBO4oYOnrX_8HjvTu7iJquTecmM6dn3gm4Usyq5r6RtDhMLM2WW-9PH59kFq42eot52wruywreQ9BpOxW7NdneB_qBcj3n_7lV4&sig=Cg0ArKJSzArFFeTA9RpOEAE&adk=2778923653&tt=-1&bs=1585%2C1200&mtos=1078,1078,1078,1078,1078&tos=1078,0,0,0,0&p=121,1318,721,1478&cm=1&mcvt=1078&rs=0&ht=0&tfs=125&tls=1203&mc=1<e=1&bas=0&bac=0&met=ie&avms=nio&exg=1&md=2&lm=2&rst=1573857465557&dlt&rpt=225&isd=0&msd=0&ext&imams=1&xdi=0&ps=1585%2C4569&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-4-12-3-11-11-0-0-0&tvt=1201&is=160%2C600&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191113
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame A60D
|
42 B
110 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:820::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsubCC5MMdDWe9jCBCQmLHdVL_K9aTdPoq0TaLSL7kBhq3k9MQlnbDrtW7LAwOq4p2bbjhxNQJwu31dphtHxV4XhgMUSZ3mw6GC9X7TEI-E&sig=Cg0ArKJSzCn6fJgHdJPEEAE&adk=1428895410&tt=-1&bs=1585%2C1200&mtos=1073,1073,1073,1073,1073&tos=1073,0,0,0,0&p=438,968,688,1268&cm=1&mcvt=1073&rs=0&ht=0&tfs=102&tls=1175&mc=1<e=1&bas=0&bac=0&met=ie&avms=nio&exg=1&md=2&lm=2&rst=1573857465689&dlt&rpt=223&isd=0&msd=0&ext&imams=1&xdi=0&ps=1585%2C4569&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-5-12-2-11-11-0-0-0&tvt=1174&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191113
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:820::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
5198271552
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
44 B
248 B
|
7ms
7ms
|
XHR
application/json |
52.29.86.7
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
showad.js
ads.pubmatic.com/AdServer/js/
Frame 1438
|
0
0
|
21ms
6ms
|
Document
text/html |
2.18.233.180
Akamai Technologies
|
|
|
GET
H2
|
200
|
index.html
cdn.districtm.io/ids/
Frame 4D6F
|
0
0
|
107ms
103ms
|
Document
text/html |
104.16.68.69
Cloudflare
|
|
General
- Full URL
- https://cdn.districtm.io/ids/index.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.68.69
, United States,
ASN13335
(CLOUDFLARENET - Cloudflare, Inc., US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
GET
H2
|
200
|
pd
eu-u.openx.net/w/1.0/
Frame C18F
Redirect Chain
-
https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
-
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
|
0
0
|
16ms
16ms
|
Document
text/html |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.167.1 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
data
lb67.s400.meetrics.net/
|
43 B
308 B
|
3ms
1ms
|
Image
image/gif |
136.243.4.7
HETZNER-AS
|
|
General
- Full URL
- https://lb67.s400.meetrics.net/data?/cgK2HJOBALl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A3zA41A30A20Az2A0hEhyB2iEjrFrwBpBFUkzFFCPBCAAAAAAABzSmAPAAAFAAzSmTTfPAPAAAJPA2GABTfPAZAAAOA55A55A85B55A58E55A55AGAx1A24A1xArTfPAPtBAJPA2GAHTfPAPAAAmUA5BAHbosAPNDAAZAwSAcAAAASksFeFjAAAAAAAAAAAAEAAAzSmAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA5wA4zAzxA41AGAkpFylFj0FAAAAIAy4A01AwzA31AKA1xA54Ay3Ax1A1yAJAylFj0FhuFnsFlBFKA1xA54Ay3Ax1A1yAKA1xA54Ay3Ax1A1yAzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPA2GAsEA6DAFAAATfPAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFgsiATA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.4.7
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h215.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
256ms
85ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=4ab0d7a7-cb9b-4c17-f3b6-646d458a0632&tv={c:u5a5pd,pingTime:5,time:5045,type:p,clog:[{piv:100,vs:i,r:,w:160,h:600,t:18}],es:0,sc:1,ha:1,gm:0,slTimes:{i:5045,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1318.121.160.600,am:i,cc:1318.121.160.600,piv:100,obst:0,th:0,reas:,bkn:{piv:[5040~100],as:[5040~160.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:254,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754022|1h.346702-39754020,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.1
|
200
OK
|
dt
dt.adsafeprotected.com/
|
43 B
301 B
|
179ms
84ms
|
Image
image/gif |
104.244.36.20
Integral Ad Science
|
|
General
- Full URL
- https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=301f1fa4-5802-8636-9560-d9f5832ac8bf&tv={c:u5a5rQ,pingTime:5,time:5062,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:5062,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:16,wc:0.0.1600.1200,ac:968.438.300.250,am:i,cc:968.438.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[5058~100],as:[5058~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:178,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g.346702-39754022|1g1|1h*.346702-39754020,idMap:1h*,rend:0,renddet:WINDOW,rmeas:0}&br=u
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
104.244.36.20
, United States,
ASN7415
(ADSAFE-1 - Integral Ad Science, Inc., US),
- Reverse DNS
- nyidt.adsafeprotected.com
- Software
-
nginx /
- Resource Hash
- b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
18ms
6ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|