URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Submission Tags: phishing malicious Search All
Submission: On March 05 via api from US

Summary

This website contacted 68 IPs in 10 countries across 62 domains to perform 248 HTTP transactions. The main IP is 178.19.72.10, located in Germany and belongs to HGCOMP-ASN, DE. The main domain is www.giga.de.
TLS certificate: Issued by RapidSSL RSA CA 2018 on July 18th 2018. Valid for: 2 years.
This is the only time www.giga.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
15 178.19.72.10 29551 (HGCOMP-ASN)
1 46.253.113.178 29551 (HGCOMP-ASN)
1 151.101.14.217 54113 (FASTLY)
1 91.215.100.39 43407 (INFONLINE-AS)
3 188.40.16.106 24940 (HETZNER-AS)
4 178.19.70.100 29551 (HGCOMP-ASN)
27 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 3 46.253.113.181 29551 (HGCOMP-ASN)
1 2 161.156.66.178 36351 (SOFTLAYER)
2 2a03:2880:f12... 32934 (FACEBOOK)
14 2a00:1450:400... 15169 (GOOGLE)
3 143.204.90.242 16509 (AMAZON-02)
5 17 2.19.33.59 20940 (AKAMAI-ASN1)
1 193.46.63.75 43407 (INFONLINE-AS)
1 2 91.215.103.65 43407 (INFONLINE-AS)
6 109.71.25.30 29551 (HGCOMP-ASN)
4 107.178.241.34 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
3 2a00:1450:400... 15169 (GOOGLE)
3 178.19.72.20 29551 (HGCOMP-ASN)
15 151.101.114.2 54113 (FASTLY)
3 2a02:2638::3 44788 (ASN-CRITE...)
1 20 172.217.23.130 15169 (GOOGLE)
1 13.224.194.92 16509 (AMAZON-02)
1 23.210.248.245 16625 (AKAMAI-AS)
1 1 2600:9000:21f... 16509 (AMAZON-02)
1 2600:9000:21f... 16509 (AMAZON-02)
2 2a02:26f0:eb:... 20940 (AKAMAI-ASN1)
1 3.124.69.248 16509 (AMAZON-02)
1 178.19.65.130 29551 (HGCOMP-ASN)
1 2a00:1450:400... 15169 (GOOGLE)
2 2606:4700:20:... 13335 (CLOUDFLAR...)
1 2a00:1450:400... 15169 (GOOGLE)
1 2606:4700::68... 13335 (CLOUDFLAR...)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
6 35.156.162.45 16509 (AMAZON-02)
8 136.243.3.132 24940 (HETZNER-AS)
3 5 18.185.150.7 16509 (AMAZON-02)
2 52.219.74.159 16509 (AMAZON-02)
1 2 52.94.216.48 16509 (AMAZON-02)
1 3 23.43.115.95 20940 (AKAMAI-ASN1)
3 185.33.223.209 29990 (ASN-APPNEX)
3 3 172.217.22.98 15169 (GOOGLE)
1 2.16.122.151 20940 (AKAMAI-ASN1)
14 2a00:1450:400... 15169 (GOOGLE)
3 143.204.101.32 16509 (AMAZON-02)
2 151.101.13.194 54113 (FASTLY)
1 11 151.101.14.2 54113 (FASTLY)
6 52.57.208.4 16509 (AMAZON-02)
3 151.101.14.49 54113 (FASTLY)
1 1 35.201.85.158 15169 (GOOGLE)
2 2 18.194.102.89 16509 (AMAZON-02)
1 3 151.101.114.49 54113 (FASTLY)
1 69.173.144.139 26667 (RUBICONPR...)
1 1 40.113.136.100 8075 (MICROSOFT...)
2 2 185.29.135.234 30419 (MEDIAMATH...)
2 2 185.184.8.30 204995 (RTB-HOUSE...)
2 2 52.19.114.209 16509 (AMAZON-02)
1 1 35.162.160.88 16509 (AMAZON-02)
1 192.132.33.46 18568 (BIDTELLECT)
1 141.226.224.32 200478 (TABOOLA-AS)
3 3 18.196.121.150 16509 (AMAZON-02)
2 2 136.243.75.34 24940 (HETZNER-AS)
2 5.9.139.135 24940 (HETZNER-AS)
1 144.76.9.6 24940 (HETZNER-AS)
1 37.157.6.241 198622 (ADFORM)
5 108.128.27.24 16509 (AMAZON-02)
1 89.163.159.103 24961 (MYLOC-AS)
1 194.213.222.30 5588 (GTSCE GTS...)
2 54.76.119.33 16509 (AMAZON-02)
1 2600:9000:20e... 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 2620:1ec:bdf::10 8068 (MICROSOFT...)
1 2600:9000:215... 16509 (AMAZON-02)
1 2600:9000:215... 16509 (AMAZON-02)
1 54.154.128.203 16509 (AMAZON-02)
1 34.252.24.237 16509 (AMAZON-02)
248 68
Apex Domain
Subdomains
Transfer
32 taboola.com
cdn.taboola.com
trc.taboola.com
15.taboola.com
match.taboola.com
cds.taboola.com
vidstat.taboola.com
imprammp.taboola.com
convammp.taboola.com
567 KB
28 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
164 KB
27 giga.de
www.giga.de
static.giga.de
videos.giga.de
ssl.2.damoh.giga.de
ssl.1.damoh.giga.de
475 KB
26 doubleclick.net
googleads.g.doubleclick.net
securepubads.g.doubleclick.net
cm.g.doubleclick.net
384 KB
16 m6r.eu
cdn.m6r.eu
tracking.m6r.eu
10 KB
14 google-analytics.com
www.google-analytics.com
19 KB
12 yieldlove-ad-serving.net
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
2 KB
9 googletagservices.com
www.googletagservices.com
207 KB
8 meetrics.net
lb46.s400.meetrics.net
2 KB
7 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
quiz.stroeermediabrands.de
177 KB
6 pubstack.io
boot.pubstack.io
acdn.prod.pubstack.io
intake.prod.pubstack.io
20 KB
6 adscale.de
ih.adscale.de
js.adscale.de
7 KB
6 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
22 KB
5 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
29 KB
4 google.de
adservice.google.de
699 B
4 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
13 KB
3 bidswitch.net
x.bidswitch.net
1 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
61 KB
3 adnxs.com
ib.adnxs.com
2 KB
3 scorecardresearch.com
sb.scorecardresearch.com
2 KB
3 criteo.net
static.criteo.net
30 KB
3 giga-abs.de
go.giga-abs.de
2 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
849 B
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 xplosion.de
ups.xplosion.de
4 KB
2 adhigh.net
px.adhigh.net
936 B
2 adsrvr.org
match.adsrvr.org
914 B
2 creativecdn.com
creativecdn.com
ams.creativecdn.com
763 B
2 mathtag.com
sync.mathtag.com
1 KB
2 mfadsrvr.com
rtb.mfadsrvr.com
1 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
21 KB
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 googleapis.com
ajax.googleapis.com
imasdk.googleapis.com
119 KB
2 facebook.com
www.facebook.com
508 B
2 vgwort.de
ssl-econa.met.vgwort.de
777 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
582 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
316 B
1 theadex.com
dmp.theadex.com
14 KB
1 adform.net
track.adform.net
495 B
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
429 B
1 powerlinks.com
px.powerlinks.com
425 B
1 rubiconproject.com
pixel.rubiconproject.com
239 B
1 zorosrv.com
match.zorosrv.com
317 B
1 exposebox.com
server.exposebox.com
217 B
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
343 B
1 yieldlab.net
ad.yieldlab.net
360 B
1 giga-video.de
files.giga-video.de
30 KB
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 cloudflare.com
cdnjs.cloudflare.com
2 KB
1 dkuim.de
dkuim.de
151 KB
1 dunkirkinception.com
www.dunkirkinception.com
490 B
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
3 KB
1 userreport.com
nugmw.userreport.com
2 KB
1 nuggad.net
si.nuggad.net
603 B
1 mxcdn.net
s400.mxcdn.net
49 KB
1 yieldlove.com
cdn-a.yieldlove.com
89 KB
1 google.com
adservice.google.com
171 B
1 gstatic.com
www.gstatic.com
157 B
1 speedcurve.com
cdn.speedcurve.com
7 KB
0 contextweb.com Failed
bh.contextweb.com Failed
248 62
Domain Requested by
20 securepubads.g.doubleclick.net 1 redirects js.stroeermediabrands.de
securepubads.g.doubleclick.net
www.giga.de
www.googletagservices.com
15 tracking.m6r.eu 4 redirects www.giga.de
tracking.m6r.eu
15 www.giga.de www.giga.de
14 tpc.googlesyndication.com securepubads.g.doubleclick.net
tpc.googlesyndication.com
pagead2.googlesyndication.com
14 www.google-analytics.com www.giga.de
14 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
11 trc.taboola.com 1 redirects cdn.taboola.com
www.giga.de
9 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
8 lb46.s400.meetrics.net www.giga.de
8 cdn.taboola.com www.giga.de
cdn.taboola.com
7 vidstat.taboola.com cdn.taboola.com
vidstat.taboola.com
6 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
6 prod-ingestion.tracking.v2.yieldlove-ad-serving.net cdn-a.yieldlove.com
6 videos.giga.de www.giga.de
videos.giga.de
text
5 ih.adscale.de 3 redirects www.giga.de
js.adscale.de
4 intake.prod.pubstack.io www.giga.de
4 adservice.google.de pagead2.googlesyndication.com
www.googletagservices.com
3 x.bidswitch.net 3 redirects
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 cm.g.doubleclick.net 3 redirects
3 ib.adnxs.com www.giga.de
3 sb.scorecardresearch.com 1 redirects cdn.taboola.com
www.giga.de
3 static.criteo.net www.giga.de
3 go.giga-abs.de www.giga.de
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
3 quiz.stroeermediabrands.de 1 redirects www.giga.de
3 static.giga.de www.giga.de
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
2 ups.xplosion.de js.stroeermediabrands.de
cdn.emetriq.de
2 ssl.2.damoh.giga.de text
2 t.nativendo.de c.nativendo.de
2 px.adhigh.net 2 redirects
2 match.adsrvr.org 2 redirects
2 sync.mathtag.com 2 redirects
2 match.taboola.com 1 redirects vidstat.taboola.com
2 rtb.mfadsrvr.com 2 redirects
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 aax-eu.amazon-adsystem.com 1 redirects c.amazon-adsystem.com
2 s3.eu-central-1.amazonaws.com videos.giga.de
text
2 c.nativendo.de d.nativendo.de
c.nativendo.de
2 d.nativendo.de www.giga.de
c.nativendo.de
2 de.ioam.de 1 redirects www.giga.de
2 www.facebook.com www.giga.de
2 ssl-econa.met.vgwort.de 1 redirects www.giga.de
1 adstax-match.adrtx.net cdn.adrtx.net
1 cdn.adrtx.net www.giga.de
1 d.agkn.com js.agkn.com
1 cdn.emetriq.de ups.xplosion.de
1 acdn.prod.pubstack.io boot.pubstack.io
1 convammp.taboola.com
1 de-gmtdmp.mookie1.com
1 js.agkn.com js.stroeermediabrands.de
1 bbcdn-bbnaut.ibillboard.com js.stroeermediabrands.de
1 dmp.theadex.com js.stroeermediabrands.de
1 js.adscale.de js.stroeermediabrands.de
1 boot.pubstack.io js.stroeermediabrands.de
1 track.adform.net js.stroeermediabrands.de
1 imprammp.taboola.com www.giga.de
1 ssl.1.damoh.giga.de text
1 cds.taboola.com www.giga.de
1 bttrack.com www.giga.de
1 www.storygize.net 1 redirects
1 ams.creativecdn.com 1 redirects
1 creativecdn.com 1 redirects
1 px.powerlinks.com 1 redirects
1 pixel.rubiconproject.com www.giga.de
1 match.zorosrv.com www.giga.de
1 server.exposebox.com 1 redirects
1 15.taboola.com cdn.taboola.com
1 cdn.stroeerdigitalmedia.de www.giga.de
1 ad.yieldlab.net www.giga.de
1 files.giga-video.de www.giga.de
1 maxcdn.bootstrapcdn.com www.giga.de
1 cdnjs.cloudflare.com www.giga.de
1 imasdk.googleapis.com videos.giga.de
1 ajax.googleapis.com www.giga.de
1 dkuim.de www.giga.de
1 www.dunkirkinception.com www.giga.de
1 cdn.stroeerdigitalgroup.de js.stroeermediabrands.de
1 nugmw.userreport.com www.giga.de
1 si.nuggad.net 1 redirects
1 s400.mxcdn.net js.stroeermediabrands.de
1 cdn-a.yieldlove.com js.stroeermediabrands.de
1 adservice.google.com pagead2.googlesyndication.com
1 irqs.ioam.de script.ioam.de
1 cdn.m6r.eu 1 redirects
1 www.gstatic.com www.giga.de
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
1 js.stroeermediabrands.de www.giga.de
0 bh.contextweb.com Failed www.giga.de
248 92
Subject Issuer Validity Valid
*.giga.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-02
2 years crt.sh
*.stroeermediabrands.de
RapidSSL RSA CA 2018
2018-09-06 -
2020-12-05
2 years crt.sh
a3.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2020-03-04 -
2020-09-10
6 months crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2020-02-12 -
2020-05-06
3 months crt.sh
*.google.com
GTS CA 1O1
2020-02-12 -
2020-05-06
3 months crt.sh
*.met.vgwort.de
Thawte RSA CA 2018
2018-05-22 -
2020-03-25
2 years crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2020-01-16 -
2020-04-15
3 months crt.sh
*.google-analytics.com
GTS CA 1O1
2020-02-12 -
2020-05-06
3 months crt.sh
c.amazon-adsystem.com
Amazon
2019-10-07 -
2020-09-29
a year crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year crt.sh
*.nativendo.de
Thawte TLS RSA CA G1
2019-04-30 -
2021-05-29
2 years crt.sh
*.giga-abs.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-09-04
2 years crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2020-03-03 -
2020-07-25
5 months crt.sh
*.criteo.net
DigiCert ECC Secure Server CA
2019-12-03 -
2021-04-06
a year crt.sh
cdn-a.yieldlove.com
Amazon
2019-10-02 -
2020-11-02
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2019-11-04 -
2021-02-02
a year crt.sh
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
2 years crt.sh
cdn.stroeerdigitalgroup.de
DigiCert Secure Site ECC CA-1
2020-02-13 -
2021-04-13
a year crt.sh
www.dunkirkinception.com
Amazon
2019-05-22 -
2020-06-22
a year crt.sh
*.dkuim.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-03
2 years crt.sh
*.storage.googleapis.com
GTS CA 1O1
2020-02-12 -
2020-05-06
3 months crt.sh
sni.cloudflaressl.com
CloudFlare Inc ECC CA-2
2019-11-17 -
2020-10-09
a year crt.sh
ssl412106.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-12-05 -
2020-06-12
6 months crt.sh
*.bootstrapcdn.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-14 -
2020-10-13
a year crt.sh
*.tracking.v2.yieldlove-ad-serving.net
Amazon
2019-11-25 -
2020-12-25
a year crt.sh
meetrics.net
Let's Encrypt Authority X3
2020-02-24 -
2020-05-24
3 months crt.sh
*.adscale.de
Amazon
2019-07-03 -
2020-08-03
a year crt.sh
*.giga-video.de
RapidSSL RSA CA 2018
2019-11-15 -
2022-02-13
2 years crt.sh
*.s3.eu-central-1.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-11-09 -
2020-12-10
a year crt.sh
aax-eu.amazon-adsystem.com
Amazon
2019-09-18 -
2020-08-26
a year crt.sh
*.scorecardresearch.com
Sectigo RSA Organization Validation Secure Server CA
2019-12-16 -
2020-12-25
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2020-02-04 -
2021-05-05
a year crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2020-02-12 -
2020-05-06
3 months crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-12-18 -
2020-12-18
a year crt.sh
yieldlove-ad-serving.net
Amazon
2019-11-19 -
2020-12-19
a year crt.sh
g2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-11-21 -
2020-11-12
a year crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.bttrack.com
Sectigo RSA Domain Validation Secure Server CA
2019-03-19 -
2021-04-13
2 years crt.sh
*.taboola.com
DigiCert ECC Secure Server CA
2019-09-03 -
2020-09-10
a year crt.sh
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2020-03-03 -
2020-06-01
3 months crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
*.prod.pubstack.io
Amazon
2019-09-18 -
2020-10-18
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2019-10-11 -
2021-10-10
2 years crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2020-01-08 -
2021-03-08
a year crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
a year crt.sh
acdn.prod.pubstack.io
DigiCert SHA2 Secure Server CA
2019-11-28 -
2020-11-28
a year crt.sh
*.emetriq.de
RapidSSL RSA CA 2018
2020-02-13 -
2022-04-13
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 24 frames:

Primary Page: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Frame ID: 463BCCBC54E5FCC618061764E53980FE
Requests: 160 HTTP requests in this frame

Frame: https://videos.giga.de/embed/176875
Frame ID: 73F9A1D1F97FC2A1B05942C969EAB264
Requests: 18 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20200303/r20190131/zrt_lookup.html
Frame ID: FA42D5C75E66358383B3C581D4DF7B75
Requests: 1 HTTP requests in this frame

Frame: https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Frame ID: D7146C6B3CE2B3B243D830B5E553DEFB
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1459277723&w=468&lmt=1583389043&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1583389043622&bpp=14&bdt=227&fdt=104&idt=104&shv=r20200303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=5072409614088&frm=20&pv=2&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&ga_fc=0&iag=0&icsg=13210925151038&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=318&ady=450&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=4221733706430658&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=upU0N5Urlg&p=https%3A//www.giga.de&dtd=121
Frame ID: 0E5CF2CAAE4A0DE8969BA8D663B576A1
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1583389043&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1583389043677&bpp=5&bdt=281&fdt=102&idt=102&shv=r20200303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=5072409614088&frm=20&pv=1&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&ga_fc=0&iag=0&icsg=13210925151038&dssz=68&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&oid=3&pvsid=4221733706430658&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=113
Frame ID: BC4F290B086F4A8EB73B9F5C3C8106DC
Requests: 1 HTTP requests in this frame

Frame: https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
Frame ID: E736A79A0CA1589CF71495AA7C684992
Requests: 1 HTTP requests in this frame

Frame: https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Frame ID: 14EA30D97643335E85777F0BE0E3CB18
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssLn-wmH-snpxkx3ENNR9976cFD2BBIPakdzMbrr9-JqWqIBVfD6fqUAjOq9XSbAww8j17k4sc90n6EsbPEOIKBe-oESnUkQn0UDNA4Law9pskxnyg1jU0F6Zr-vblMB2izaY2n3Ko_ekvd3MAhrsXJ4MDwU3yjSJE6N90itIwHrdslZX_tj-iVM-cEY-pJbKufHkEt6T5FlK8beRAfYn8qhM8P5p17y-8hiCq2RB-E2vyyiZHsvEoFcLLzq00nYb6Zzmeckm9LHpQAlwmr&sig=Cg0ArKJSzNXaQN2X1NuVEAE&urlfix=1&adurl=
Frame ID: B57AB211D470B46F8BEAC4D5232A1A30
Requests: 14 HTTP requests in this frame

Frame: https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_2go82tcbo7w
Frame ID: 786FA0BC925BDEFC62BE4CE58B517B55
Requests: 15 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstR_FS4Cm2UGKJKY7DNQH8zGzJjVcVbDZKsfyx_JRp1OUz-Bxq3myAe4ng4xhkn4MdcRLud77G7SQ8M-PwvKMjtxH1RViOtJQOurLbXU3xjsKlV_5s_pdQTaUVUnpfmj1j0z6pRuIHh77EonqQiIqgd87H8Jp-audZO96KB8DFfvdVczgFsvVyrbXJg54zptskD7aQKZ-LaIlb9ERtfjTSqaQ7_jJtq2w_8x4Xu6MaYGFvp4NvGwm-vymAHB0LU-lmzFpcktlrK90kwBkw75w&sig=Cg0ArKJSzHLurNgzjXimEAE&urlfix=1&adurl=
Frame ID: 5912486C53EE3A3951AAB4A2FBCD343B
Requests: 15 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstv44J-UIuWVL7nP8O40yVTXVJTjXNcZ8Qzqygkf2S4qJS1Uj809kbJrI7y0R5dNXiNLOmj-DUNfFavDPjvsdae7i5pzEWWOeSHr5h9I4-7a6qOx9Y8u46SGd3Pg1uO55fK1HWW7YgHLxqIvWMOYZYmFgf-mQurLMv1TPe7rid-S1nv1J3ms3B-m83wPoQFNVGTv9PXVn25PRYyy6TrXqntiIEyfvh0wKDZMfsBWki2p0sY2MgB2DE7LQul4fLrNvmgAII7TIdGpPujHyNdfQ&sig=Cg0ArKJSzMUB8zfMT3lYEAE&urlfix=1&adurl=
Frame ID: 6944E307C91BF362829E42180614F6E8
Requests: 13 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Frame ID: 849C9A1B3416F98E2BA894A171E3E97E
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Frame ID: C29F45F60CD070372511D9FBDB65DC5C
Requests: 1 HTTP requests in this frame

Frame: data://truncated
Frame ID: FA1F6BFC477F931BC9C4BE353BB10E57
Requests: 1 HTTP requests in this frame

Frame: https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=987ED447D723941138969859662&cicmp=1657475&cijs=1&dast=V7ydYCFgMUnIS00PDt0AQUnIS00PDt0AUAAAAGBvQHGzncrUik0W7Em2yWo8Vis5sNl7vhbDHbTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3whabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-hpOHz-gofz8DC7xX6f0-7W_N06l9H0eavuJrfm7xb7XZ7TW2m0vMV-n9PuFlz-FrPL7fLLAQAAAOABQKmwH-IHEAAgAgAAAEACAAAAgCKg4t9C4AIAAAAAA6AA60cDgIJDYV0uy8Vl-bns_gAAeAgAAQAYUCABGMBpKgGoyDk4AQAAAAAAAABg-f___48B0CM-kwHIUBq8MegBePABeBACAAC4GDoQxWEFEDsxISpILGIEAAAAIGU2YXg0qRMqiyoAAIJ0K4ArAIAAuNSrt8os3UGJtzAAAACCsQV6WPx-s8Ou8btdBgAAAAAAAABg9n_2jybEZMCdBkT5Tar2CwgAsPYLCADApm4AAG8CcEEXAKsziMlmtJvMDgAAAODu____Xw-kXIOJczHZDAYjl2s58hiHM9ty4zCuVpPBzDZabO_V3IfsKwrkum9EWGa_76CgnJ4es8sgY7lMBrVA1jS5_AbxQcOwnAyC-U3YYrSaTDbL4Wy5mAyGo-FotD-BGw1wgobDwWI3WOwWi-FkMRkNloMFCsRgghMyHG0mq9FutZssh5PRaLaZbJCiVavZaDMYrmaT2W63Gg6Gy9EIKVqzmE0mi9loudsMlpPRYDgZDhFGhqvZaDfYrCUWz8gtmthGa4VtZXJLRpvRxLeYzHYTl1v0-pheq4VjZTNN8aFOF8e-dmGoTh_HvnbiomAA2V4EF-lEc7r8XS7LW_O2uHVOn8MilmhOFulEdtm3XIOJczHZDAYjl2s58hiHM9ty4zCuVpPBzDZa7CvD1Wy0G2zWEotn5BZNbKO1wrYyuSWjzWjiW0xmu4nLLXp9TK_VwrGymfaN1XCzGS4Ho9G-sRpuNsPlYDTad-gM39XnbFTetAqPTmp2No4vmemgcBks3o1qdRx_Jgdp2Wx06pSJY1Fj9Pv9fr_f7_f7_X6D1nMwGxS-a1mq_Bt2N-c2-zoYFbFEcLpIJ6KX8XQRSyRPi3SisphWM9_K4ptYLBaXcbQwmZzL3WgymGxmrtVyYRFLlKaLdKLXvSwOw-HzFzych4fZL3oaDp-_4OE8PMxusd_ntLs1f7fOZTR93qq7ya35u8V-l-f0Vhotb7Hf57S7BZe_xexyuyzqPzbgZK4YTOaK5VyxGa0SAAAAAAAAAMAS5sybAAAAAJwGslgMJovlAkCIse4SfEqFPDqBvxU3fgwxp8vf5bK8NW-LW-f0Ocy8GQ!&excid=22&tst=1&docw=0&cs=false
Frame ID: E2AACA51DF20E88A6AF96DDA114FEB0F
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Frame ID: CBD8D4C5577F8AD47842B9C68EAC0792
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Frame ID: 9DDAB49FFA78C3C796C05FE9D552EFC1
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Frame ID: 1ED54501507BB49CF0CE7045295EA592
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Frame ID: 63915C0F70B89722BBACD4C2A09B8881
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7TMMCFgMUnIS00PDt0AQUnIS00PDt0AUAAAAGBvQHGzncrUik0W7Em2yWo8ViM1zOlsPVcjabDGEjh7sViTTajXiTzXK0WGx2s-FyN5wtZpsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABQcCisy2W5uCw_l90fAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiUWMAAAAAKTMJgyPJnVCZVEFAECQbgVwBQAQAJd69VYZBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhJgMuNOAKL9J1X4BAQDWfgEBANjUDQDgTQAu6AJgdQYx2Yx2k9kBAAAA3P3____rgZRrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRovtvZr7kH1FgVz3jQjL7PcdFJTT02N2GWQsl8mgFsiaJpffID5oGJaTQTC_CVuMVpPJZjmcLReTwXA0HI32J3CjAU7QcDhY7AaL3WIxnCwmo8FysECBGExwQoajzWQ12q12k-VwMhrNNpMNUrRqNRttBsPVbDLb7VbDwXA5GiFFaxazyWQxGy13m8FyMhoMJ8MhwshwNRvtBpu1xOIZuUUT22itsK1MbsloM5r4FpPZbuJyi14f02u1cKxspik-1Oni2NcuDNXp49jXTlwUDCDbi-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-5ZrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRot9ZbiajXaDzVpi8YzcoolttFbYVia3ZLQZTXyLyWw3cblFr4_ptVo4VjbTvrEabjbD5WA02jdWw81muByMRvsOneG7-pyNyptW4dFJzc7G8SUzHRQug8W7Ua2O48_kIC2bjU6dMnEsaox-v9_v9_v9fr_fb9B6DmaDwnctS5V_w-7m3GZfB6MilghOF-lE9DKeLmKJ5GmRTlQW02rmW1l8E4vF4jKOFiaTc7kbTQaTzcy1Wi4sYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HBpzMFYPJXLGcKzajVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HmQM!&excid=22&docw=0&cijs=1
Frame ID: 26832D6EC9779C047BA6C639ECBB3A4A
Requests: 1 HTTP requests in this frame

Frame: https://ih.adscale.de/map?ssl=1&format=video&nut&uu=03d0ed3eec424d81bd16e3fafbaa79a9
Frame ID: 99445FEB796D5111189122342E0AAE5A
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=756780735&gdpr=&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%22%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
Frame ID: 36D03A83616137EE46E51F7DCB93CD43
Requests: 1 HTTP requests in this frame

Frame: https://adstax-match.adrtx.net/activation?receiverId=adaud
Frame ID: 2523E42DCF5A4BDA20F0A64DE080BFBE
Requests: 1 HTTP requests in this frame

Screenshot


Detected technologies

Overall confidence: 100%
Detected patterns
  • headers server /nginx(?:\/([\d.]+))?/i

Overall confidence: 100%
Detected patterns
  • script /googlesyndication\.com\//i

Overall confidence: 100%
Detected patterns
  • script /google-analytics\.com\/(?:ga|urchin|analytics)\.js/i

Overall confidence: 100%
Detected patterns
  • html /<iframe[^>]* (?:id="comscore"|scr=[^>]+comscore)|\.scorecardresearch\.com\/beacon\.js|COMSCORE\.beacon/i
  • script /\.scorecardresearch\.com\/beacon\.js|COMSCORE\.beacon/i

Page Statistics

248
Requests

98 %
HTTPS

26 %
IPv6

62
Domains

92
Subdomains

68
IPs

10
Countries

2703 kB
Transfer

8648 kB
Size

2
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 12
  • https://quiz.stroeermediabrands.de/pub/t.png?assetId=GIGA&contentId=01D6BEJQS58817042SEQCV3CEK HTTP 301
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1 HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 16
  • https://cdn.m6r.eu/sync/api HTTP 302
  • https://tracking.m6r.eu/sync/api?checkcookies=true
Request Chain 18
  • 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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=001c&i2=001ce0a44d59a6efa5e609973&ep=1610005817&vr=416&id=sxnjyl&i3=001ce0a44d59a6efa5e609973%3A1613801843526%3A1583389043526%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1583389043526&n1=3&dntt=0&lt=1583389043529&ev=&cs=52du5p&mo=1 HTTP 302
  • 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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=001c&i2=001ce0a44d59a6efa5e609973&ep=1610005817&vr=416&id=sxnjyl&i3=001ce0a44d59a6efa5e609973%3A1613801843526%3A1583389043526%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1583389043526&n1=3&dntt=0&lt=1583389043529&ev=&cs=52du5p&mo=1&sr=71
Request Chain 30
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software HTTP 302
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Request Chain 36
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 37
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F HTTP 302
  • https://nugmw.userreport.com/rc-ap/f185cb89-b780-4c4c-aeb7-b254025a5538/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Request Chain 92
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift HTTP 302
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
Request Chain 95
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=886c72288fc395da52cf164886d37815&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D886c72288fc395da52cf164886d37815%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=886c72288fc395da52cf164886d37815&userId=adscale-user:d1136d32b0c44146805631960db8a8b8
Request Chain 96
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=61ea3ca9ef64d8973baa907809a0b408
Request Chain 97
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=iGxyKI_DldpSzxZIhtN4FQ HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 98
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=61ea3ca9ef64d8973baa907809a0b408
Request Chain 109
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=61ea3ca9ef64d8973baa907809a0b408&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D61ea3ca9ef64d8973baa907809a0b408%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=61ea3ca9ef64d8973baa907809a0b408&userId=adscale-user:d1136d32b0c44146805631960db8a8b8
Request Chain 110
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=Yeo8qe9k2Jc7qpB4CaC0CA HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 112
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1583389044284&ns_c=UTF-8&cv=3.5&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9= HTTP 302
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1583389044284&ns_c=UTF-8&cv=3.5&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Request Chain 113
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss_ond604jtIed4RQtquEAB2WIkDvAkFII3VhhxxKcn7XgPULG0W3bZn_UuT88xaJO77hvVLqgaBp-zhAy8L4gnRX1F_YSW3NfiqdfdM89Y0Y-koDLu4eFP04yPzvLiZFmPtsr3By0pCpuE5ShaRKdkXCX1GMbhjagr0Z24G6EUrcr86kK3WVvFAAjEZ39QMtSghDPbc0WbbWINqmzFcPuPkdC7gz2aW05pnMctQqxi4RrkyNkZoUCpsawLFXl6VXorxRn4SBPL4WwdlhCTrg&sig=Cg0ArKJSzMwbBN46AmDVEAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 130
  • https://server.exposebox.com/rcm HTTP 302
  • https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_2go82tcbo7w
Request Chain 131
  • https://rtb.mfadsrvr.com/sync?ssp=taboola HTTP 302
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola HTTP 302
  • https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=826423ba-2c35-42b5-b225-309c6aaf7dc8 HTTP 302
  • https://match.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=826423ba-2c35-42b5-b225-309c6aaf7dc8&tbid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&query=taboola_hm%3D826423ba-2c35-42b5-b225-309c6aaf7dc8&isDirect=0 HTTP 302
  • https://match.zorosrv.com/match?tabid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&extuid=826423ba-2c35-42b5-b225-309c6aaf7dc8&excid=218&query=taboola_hm%3D826423ba-2c35-42b5-b225-309c6aaf7dc8
Request Chain 133
  • 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 HTTP 302
  • https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=W4Y2794f3yXpXYxZMk9cFSO1ypu5aHIZh1HLYpQKmNw%3D
Request Chain 134
  • 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] HTTP 302
  • 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]&mm_bnc&mm_bct&UUID=32ba5e60-997e-4b00-bb9a-e84a0f614c13 HTTP 302
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=32ba5e60-997e-4b00-bb9a-e84a0f614c13
Request Chain 136
  • https://creativecdn.com/cm-notify?pi=taboola HTTP 302
  • https://ams.creativecdn.com/cm-notify?pi=taboola&tc=1 HTTP 302
  • https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=AKT5bJYtOlH3fBv0Mc0S&pi=taboola&tc=1
Request Chain 138
  • https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc HTTP 302
  • https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEJaYg1pgQP9lmk-NLfvRnOU&google_cver=1
Request Chain 140
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1 HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1 HTTP 302
  • https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=c97255c2-431c-4b10-b60f-ade4181269b6
Request Chain 141
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4 HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
Request Chain 144
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola HTTP 302
  • https://px.adhigh.net/p/cm/bsw?bidswitch_ssp_id=taboola HTTP 302
  • https://px.adhigh.net/p/cm/bsw?bidswitch_ssp_id=taboola&bounced=1 HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=9&user_id=J1K1E3zDYm.AikABlFwqVdyMQ&expires=30&ssp=taboola HTTP 302
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=78f8a296-27f6-4e6e-812e-8247c871369b
Request Chain 239
  • https://ih.adscale.de/map?ssl=1&format=video HTTP 302
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=03d0ed3eec424d81bd16e3fafbaa79a9

248 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
137 KB
51 KB
Document
General
Full URL
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
962199fa51e71cd864286410a6b10c2596120c0ec8822abbedb66646e7f021a5

Request headers

:method
GET
:authority
www.giga.de
:scheme
https
:path
/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
document
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
none
sec-fetch-mode
navigate
sec-fetch-user
?1
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
document

Response headers

status
200
server
nginx
content-type
text/html;charset=UTF-8
vary
Accept-Encoding
date
Thu, 05 Mar 2020 06:17:23 GMT
x-page-speed
1.13.35.2-0
cache-control
max-age=0, no-cache
content-encoding
gzip
source-sans-pro-v11-latin-700.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
15 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-700.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
last-modified
Tue, 03 Mar 2020 13:36:34 GMT
server
nginx
accept-language
bytes
etag
"5e5e5d62-3c78"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15480
expires
Fri, 05 Mar 2021 06:17:23 GMT
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
last-modified
Tue, 03 Mar 2020 13:36:34 GMT
server
nginx
accept-language
bytes
etag
"5e5e5d62-3da8"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15784
expires
Fri, 05 Mar 2021 06:17:23 GMT
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
16 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
last-modified
Tue, 03 Mar 2020 13:36:34 GMT
server
nginx
accept-language
bytes
etag
"5e5e5d62-3e24"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15908
expires
Fri, 05 Mar 2021 06:17:23 GMT
metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
js.stroeermediabrands.de/
280 KB
63 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
46.253.113.178 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
0320996ae95e773b6cebfbeac056dd5b42c05557643373ae8309815ccfe766f7

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
last-modified
Mon, 02 Mar 2020 16:43:01 GMT
server
nginx/1.14.1
vary
Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=31536000, public immutable max-age=31536000
expires
Fri, 05 Mar 2021 06:17:23 GMT
lux.js
cdn.speedcurve.com/js/
19 KB
7 KB
Script
General
Full URL
https://cdn.speedcurve.com/js/lux.js?id=131387135
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.217 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
Apache /
Resource Hash
a56833ce8542a71a519392f11f8351575830bd5ab43ff6ea30bbcb79dbbf2844
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

strict-transport-security
max-age=15768000
content-encoding
gzip
age
30420
x-cache
HIT
status
200
x-cache-hits
1336
content-length
6490
via
1.1 varnish
x-served-by
cache-fra19167-FRA
last-modified
Wed, 04 Mar 2020 21:50:22 GMT
server
Apache
x-timer
S1583389043.468741,VS0,VE0
date
Thu, 05 Mar 2020 06:17:23 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
max-age=604800
accept-ranges
bytes
timing-allow-origin
*
expires
Wed, 11 Mar 2020 21:50:22 GMT
pre-352328ff0e.js
www.giga.de/static-local/dist/assets/js/
33 KB
11 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/pre-352328ff0e.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8f0aedeb149fe3b5bf923f3555963bf08ddf19aa1b484491e7119b3ab531c4d7

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 20 Feb 2020 12:29:55 GMT
content-encoding
gzip
x-original-content-length
34022
server
nginx
status
200
etag
W/"5e4e7b67-84e6"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
10687
expires
Fri, 19 Feb 2021 12:29:55 GMT
main-desktop-f34d9f83d5.css
www.giga.de/static-local/dist/assets/css/
548 KB
62 KB
Stylesheet
General
Full URL
https://www.giga.de/static-local/dist/assets/css/main-desktop-f34d9f83d5.css
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
867fcdee994f97b16fef41ae32d08824c740548971a14308fb80a60dd30c8694

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
style

Response headers

date
Mon, 02 Mar 2020 16:35:02 GMT
content-encoding
gzip
x-original-content-length
561376
server
nginx
status
200
etag
W/"5e5d355d-890e0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
63075
expires
Tue, 02 Mar 2021 16:35:02 GMT
iam.js
script.ioam.de/
38 KB
11 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.12 001c
Resource Hash
655fe20a2239e6d0a41bae033831dd52a3b116da58c1a660377b1660d6e51e10

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
Content-Encoding
gzip
Last-Modified
Thu, 05 Mar 2020 06:17:23 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.12 001c
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Thu, 05 Mar 2020 08:17:23 GMT
trackcp.js
gocp.stroeermediabrands.de/
28 KB
11 KB
Script
General
Full URL
https://gocp.stroeermediabrands.de/trackcp.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
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
8db3daba71f655f21d2c31ce0a75b09e27e339241b2acd3637580db9a9eb2120

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
Content-Encoding
gzip
Last-Modified
Wed, 04 Mar 2020 07:01:16 GMT
ETag
"5e5f523c-6fa7"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=86400, max-age=31536000, public
X-Machine
hn87 gocp env
Accept-Ranges
bytes
Expires
Fri, 06 Mar 2020 06:17:23 GMT
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
796 B
1 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/05/2501-rcm40x40.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Sun, 16 Feb 2020 14:40:52 GMT
x-content-type-options
nosniff
age
1524991
filer-source
ca7b44b53d5a66e850355c11821198c504e518f8f12b295bd9c54d22bb538e08
x-cache
HIT
status
200
accept-language
bytes
content-length
796
x-xss-protection
1; mode=block
last-modified
Sun, 16 Feb 2020 14:40:52 GMT
server
nginx/1.10.3
filer-attr
W1s0MCw0MF0sInNodXR0bGUtdjEiLFsiRlJBLTEiXSxbIkZSQi0xIl1d
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Tue, 17 Mar 2020 14:40:52 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
105 KB
38 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
5a0b050607d03061476a57618facae88282b14052416e63e7222fed31fc26a5d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
38519
x-xss-protection
0
server
cafe
etag
14959984671288578746
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Thu, 05 Mar 2020 06:17:23 GMT
1.gif
www.gstatic.com/psa/static/
53 B
157 B
Image
General
Full URL
https://www.gstatic.com/psa/static/1.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Wed, 04 Mar 2020 22:31:32 GMT
x-content-type-options
nosniff
last-modified
Tue, 22 Oct 2019 18:15:00 GMT
server
sffe
age
27951
content-type
image/gif
status
200
cache-control
public, max-age=31536000
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
53
x-xss-protection
0
expires
Thu, 04 Mar 2021 22:31:32 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://quiz.stroeermediabrands.de/pub/t.png?assetId=GIGA&contentId=01D6BEJQS58817042SEQCV3CEK
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
  • https://ssl-econa.met.vgwort.de/blank.gif
43 B
332 B
Image
General
Full URL
https://ssl-econa.met.vgwort.de/blank.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
161.156.66.178 , United States, ASN36351 (SOFTLAYER, US),
Reverse DNS
b2.42.9ca1.ip4.static.sl-reverse.com
Software
s2.51.1 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Thu, 05 Mar 2020 06:17:23 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.51.1
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
Last-Modified
Thu, 05 Mar 2020 06:17:23 GMT
Server
s2.51.1
Location
/blank.gif
Transfer-Encoding
chunked
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
max-age=0, no-cache, must-revalidate, proxy-revalidate
Connection
keep-alive
Expires
Tue, 22 Aug 2000 15:05:01 GMT
tr
www.facebook.com/
44 B
254 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=PageView&noscript=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f12d:83:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT, Thu, 05 Mar 2020 06:17:23 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
no-cache, must-revalidate, max-age=0
alt-svc
h3-27=":443"; ma=3600
content-length
44
expires
Thu, 05 Mar 2020 06:17:23 GMT
analytics.js
www.google-analytics.com/
44 KB
18 KB
Script
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-352328ff0e.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 06 Feb 2020 00:21:02 GMT
server
Golfe2
age
1512
date
Thu, 05 Mar 2020 05:52:11 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
18174
expires
Thu, 05 Mar 2020 07:52:11 GMT
apstag.js
c.amazon-adsystem.com/aax2/
87 KB
25 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-352328ff0e.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.90.242 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-90-242.fra50.r.cloudfront.net
Software
Server /
Resource Hash
ac2a58f9d55c4642121cfb6f7e213cbc882bbdd75ef171ca8a07ed982ef693ce

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Wed, 04 Mar 2020 22:00:54 GMT
content-encoding
gzip
server
Server
age
29788
etag
1dcfbf3986ee8b9c3abbc67eb808ab43
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA50-C1
accept-ranges
bytes
x-amz-cf-id
E1jYfcbQjHF3UKofNt9ApKVPmdtJchqqku5PkTlLCBoiBBxAeraBjg==
via
1.1 5721f7035c3fc934bd3f96dbb04ba1e5.cloudfront.net (CloudFront)
api
tracking.m6r.eu/sync/
Redirect Chain
  • https://cdn.m6r.eu/sync/api
  • https://tracking.m6r.eu/sync/api?checkcookies=true
1 KB
1 KB
Script
General
Full URL
https://tracking.m6r.eu/sync/api?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
Content-Encoding
gzip
Last-Modified
Thu, 27 Feb 2020 09:59:54 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654

Redirect headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:23 GMT
Server
nginx
Vary
Accept
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/api?checkcookies=true
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
72
Expires
Thu, 05 Mar 2020 06:17:23 GMT
identitystatus
irqs.ioam.de/
25 B
203 B
XHR
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.38876058847363426
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

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
strict-transport-security
max-age=15768000
tx.io
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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=001c&i2=001ce0a44d59a6efa5...
  • 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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=001c&i2=001ce0a44d59a6efa5...
0
694 B
Script
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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=001c&i2=001ce0a44d59a6efa5e609973&ep=1610005817&vr=416&id=sxnjyl&i3=001ce0a44d59a6efa5e609973%3A1613801843526%3A1583389043526%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1583389043526&n1=3&dntt=0&lt=1583389043529&ev=&cs=52du5p&mo=1&sr=71
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx / BLACKBIRD-RCV v1.06.2 0040
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.06.2 0040
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
X-Powered-By
BLACKBIRD-RCV v1.06.2 0040
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Thu, 05 Mar 2020 06:17:23 GMT
Server
nginx
Location
/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=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=001c&i2=001ce0a44d59a6efa5e609973&ep=1610005817&vr=416&id=sxnjyl&i3=001ce0a44d59a6efa5e609973%3A1613801843526%3A1583389043526%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1583389043526&n1=3&dntt=0&lt=1583389043529&ev=&cs=52du5p&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Tue, 05 Mar 2019 06:17:23 GMT
lazyload-65c07b80e0.min.js
www.giga.de/static-local/dist/assets/js/vendor/lazyload/
5 KB
2 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/lazyload/lazyload-65c07b80e0.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Wed, 29 May 2019 08:31:18 GMT
content-encoding
gzip
x-original-content-length
5207
server
nginx
status
200
etag
W/"5cee42b6-1457"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2015
expires
Thu, 28 May 2020 08:31:18 GMT
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
10 KB
10 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/fontello/fontello.woff2?53628368
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f

Request headers

Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-f34d9f83d5.css
Origin
https://www.giga.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
last-modified
Tue, 03 Mar 2020 13:36:34 GMT
server
nginx
accept-language
bytes
etag
"5e5e5d62-265c"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
9820
expires
Fri, 05 Mar 2021 06:17:23 GMT
176875
videos.giga.de/embed/ Frame 73F9
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/176875
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
fe1bbf3a4709b2bb555a2487c8e3acc410817f8935529e2a971d0687f9e7f9d4

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/176875
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
same-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
ioam2018=001ce0a44d59a6efa5e609973:1613801843526:1583389043526:.giga.de:2:giga:software_content:noevent:1583389043526:bxu3ba
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx/1.14.1
date
Thu, 05 Mar 2020 06:17:23 GMT
content-type
text/html;charset=UTF-8
content-encoding
gzip
giga-b2f76341c5.js
www.giga.de/static-local/dist/assets/js/bundle/
37 KB
13 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/giga-b2f76341c5.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
2885890775cd2a2c76ba604b21c181017ad25dfc4a32b75c2fa1839b9568bd1f

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Mon, 02 Mar 2020 08:36:19 GMT
content-encoding
gzip
x-original-content-length
38339
server
nginx
status
200
etag
W/"5e5cc516-95c3"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
13511
expires
Tue, 02 Mar 2021 08:36:18 GMT
init
d.nativendo.de/cds/delivery/
1 KB
934 B
Script
General
Full URL
https://d.nativendo.de/cds/delivery/init
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
b304a662c0afc3404a1babc46805ff9f4a6b83a4853721c2e1890940c11c36ff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
last-modified
Thu, 05 Mar 2020 06:17:23 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
523
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
collect
www.google-analytics.com/r/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=2108822051&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=4GBAAEAB~&jid=498502962&gjid=1151019849&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&z=414413561
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:23 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
content-type
image/gif
status
200
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
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:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
171 B
Script
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:809::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
show_ads_impl_fy2019.js
pagead2.googlesyndication.com/pagead/js/r20200303/r20190131/
222 KB
83 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20200303/r20190131/show_ads_impl_fy2019.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:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
984b50b44ade35d903bbfa50129e85a46a2247060ae69b55e7e595fd1f7dadde
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
84919
x-xss-protection
0
server
cafe
etag
15562713877717077162
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Thu, 05 Mar 2020 06:17:23 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20200303/r20190131/ Frame FA42
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20200303/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:818::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20200303/r20190131/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
vary
Accept-Encoding
date
Wed, 04 Mar 2020 00:56:44 GMT
expires
Wed, 18 Mar 2020 00:56:44 GMT
content-type
text/html; charset=UTF-8
etag
10348540741379653356
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
4494
x-xss-protection
0
cache-control
public, max-age=1209600
age
105639
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
z.js
go.giga-abs.de/
1 KB
1 KB
Script
General
Full URL
https://go.giga-abs.de/z.js?0.7233112717647134
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
74d3720dcf1dbf863d5810d6961bfdb3b13ba6f269a2c8f5627f054b6124e676
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
X-Content-Type-Options
nosniff
Last-Modified
Thu, 05 Mar 2020 06:17:23 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Fri, 06 Mar 2020 06:17:20 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame D714
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
Document
General
Full URL
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash

Request headers

Host
tracking.m6r.eu
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Cookie
test=true
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx
Content-Type
text/html; charset=utf-8
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Content-Encoding
gzip
Date
Thu, 05 Mar 2020 06:17:23 GMT
Content-Length
1530
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=61ea3ca9ef64d8973baa907809a0b408; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Wed, 03 Jun 2020 06:17:23 GMT; Secure; SameSite=None

Redirect headers

Server
nginx
Content-Type
text/html; charset=utf-8
Content-Length
302
Location
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Date
Thu, 05 Mar 2020 06:17:23 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Thu, 05 Mar 2020 07:17:23 GMT; Secure; SameSite=None
tfa.js
cdn.taboola.com/libtrc/unip/1092206/
61 KB
21 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/unip/1092206/tfa.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
95ebbe3b755f0749ef26c07fe339baacce6266f4792e0d4cd684d064fa40b2cf

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
86MesqzKszsPH69BCFYBonhV0it_acXc
content-encoding
gzip
age
37
x-cache
HIT
status
200
date
Thu, 05 Mar 2020 06:17:23 GMT
x-amz-replication-status
COMPLETED
content-length
20920
x-amz-id-2
LI6cx4IeG+Bt2JpditpOqjn+MUsCAqQqrDtch6WaYAPzr0rNDnfLNAsDkswCIHc/iNSP/CJlE5g=
x-served-by
cache-hhn4022-HHN
last-modified
Wed, 29 Jan 2020 13:46:08 GMT
server
AmazonS3
x-timer
S1583389044.696240,VS0,VE0
etag
"2ea4087d1d031e521cbd141c1c142d48"
vary
Accept-Encoding
x-amz-request-id
4BCC8177CE4A3EF1
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
30
x-cache-hits
3
publishertag.js
static.criteo.net/js/ld/
96 KB
29 KB
Script
General
Full URL
https://static.criteo.net/js/ld/publishertag.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a02:2638::3 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
a7019b73cbcf928d42e36f0588c8748254ef15b914690083d80a629943267dcd

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
last-modified
Mon, 10 Feb 2020 14:17:04 GMT
server
nginx
access-control-allow-origin
*
etag
W/"5e4165e0-181f1"
content-type
text/javascript
status
200
cache-control
max-age=86400, public
timing-allow-origin
*
expires
Fri, 06 Mar 2020 06:17:23 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
43 KB
15 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
sffe /
Resource Hash
ef810de0980850829ba1d87d80614e11d0466743b96adc89ad67a9d242500459
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"447 / 789 of 1000 / last-modified: 1583259544"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14517
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:23 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
288 KB
89 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.194.92 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-224-194-92.fra2.r.cloudfront.net
Software
/ Express
Resource Hash
84950de4629ee3908d2e8df1fa183ea51d00e741f6910559d764f810a2b4555b

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 04:07:04 GMT
content-encoding
gzip
age
7819
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
status
200
cache-control
public, max-age=10800
x-amz-cf-pop
FRA2-C1
access-control-allow-origin
*
x-amz-cf-id
Mby5r5BcADhIHVrusESBE9TZKNr0mlURek0GLXiYSQdSCnpCbVuYnA==
via
1.1 d8328954e51c0912a8419c1a67cea1dc.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
126 KB
49 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.210.248.245 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-210-248-245.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=7200
Connection
keep-alive
Content-Type
text/javascript
Content-Length
49772
Expires
Thu, 05 Mar 2020 08:17:23 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
0
-1 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
Server
nginx
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Content-Type
text/plain; charset=utf-8
Access-Control-Allow-Origin
https://www.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72

Redirect headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
Server
nginx
Access-Control-Allow-Origin
https://www.giga.de
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72
nuggad
nugmw.userreport.com/rc-ap/f185cb89-b780-4c4c-aeb7-b254025a5538/si.nuggad.net/
Redirect Chain
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
  • https://nugmw.userreport.com/rc-ap/f185cb89-b780-4c4c-aeb7-b254025a5538/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2...
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/f185cb89-b780-4c4c-aeb7-b254025a5538/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:21f3:f600:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
8f22ebb48904dc39955840ec9dc81566a490b33f06367760e989f345abb62b85

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
via
1.1 c7015d60d4f8f2170aaaa75e69e40618.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C2
access-control-allow-methods
get, post, options
content-type
text/javascript
status
200
cache-control
s-maxage=86400, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
1812
x-amz-cf-id
cSXQhLs4H249kXajFTbL8EJpcsQU5l-guAyfztpnTVL10dXZNjTJmw==

Redirect headers

date
Thu, 05 Mar 2020 06:17:23 GMT
via
1.1 71dbd5706c5b0c7b733248e1171f2d4f.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C2
location
https://nugmw.userreport.com/rc-ap/f185cb89-b780-4c4c-aeb7-b254025a5538/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
access-control-allow-methods
get, post, options
status
302
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
0
x-amz-cf-id
mw267UIpg13BVQv0PoNKp0qpVGbKZbsa3OPmXYL3cVmMNeYRHTR0nQ==
SDG_CookieLayer.min.js
cdn.stroeerdigitalgroup.de/metatag/libraries/
15 KB
3 KB
Script
General
Full URL
https://cdn.stroeerdigitalgroup.de/metatag/libraries/SDG_CookieLayer.min.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:eb:181::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
KONICHIWA/1.0 /
Resource Hash
7036c5cd37e467a149892d8d26d5ffc2c5b6724b779f76c79cb65e466ac25a7a

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
x-amz-request-id
38AA1ADB7798E5A8
status
200
access-control-max-age
86400
content-length
2480
x-amz-id-2
kSfgG+VYWwG/XoSn2/sHQzCiY272SONrVSM2ZVZIZO9dkmNKCEmJxzK4R86fxIY0wH0/Ii+hU+Y=
last-modified
Mon, 03 Feb 2020 11:33:05 GMT
server
KONICHIWA/1.0
etag
"f5261e2f36272b68033327b1f36e61ae"
vary
Accept-Encoding
access-control-allow-methods
GET,HEAD,OPTIONS
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=49235
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
/
quiz.stroeermediabrands.de/pub/meta/
272 B
631 B
XHR
General
Full URL
https://quiz.stroeermediabrands.de/pub/meta/?q=01afe2c2-c1b4-48d2-948d-59a2d9b73b9b
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-352328ff0e.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
46.253.113.181 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8fca25bdf045cb013a9259ae9ad78676cb3384b0c70d6468172b91b85ed4e678

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
server
nginx
status
200
access-control-allow-methods
GET, POST, OPTIONS
content-type
application/json
access-control-allow-origin
*
access-control-expose-headers
Content-Length,Content-Range,Content-Type,Expires
access-control-allow-headers
DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range
expires
Thu, 05 Mar 2020 06:59:36 GMT
collect
www.google-analytics.com/
35 B
102 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd21=auto&cm17=1&cd18=4282584&z=1303137423
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581074
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
ad-loading.png
www.dunkirkinception.com/detect/
179 B
490 B
Image
General
Full URL
https://www.dunkirkinception.com/detect/ad-loading.png?p=special/gutscheine/
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.124.69.248 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-3-124-69-248.eu-central-1.compute.amazonaws.com
Software
/ TSAdServer
Resource Hash
ba263519f68b1d67e565e36be4ec1f7cb9435e7bbf7984b53a399b99e52c86de

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
image
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
ETag
W/"b3-dc5QKHyOFKuojJq/yFGaTGMBSEQ"
X-Powered-By
TSAdServer
Content-Type
image/png
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
X-Robots-Tag
noindex, nofollow
Content-Length
179
post-4661cc0bdf.js
www.giga.de/static-local/dist/assets/js/bundle/
7 KB
3 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/post-4661cc0bdf.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
a41b082a5add3cc5754af976d70900d246a3569441d546dfe86a8b6f9f19ae6a

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 27 Feb 2020 15:42:16 GMT
content-encoding
gzip
x-original-content-length
6960
server
nginx
status
200
etag
W/"5e57e2f6-1b30"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2648
expires
Fri, 26 Feb 2021 15:42:16 GMT
dkuim.js
dkuim.de/api/js/2/
465 KB
151 KB
Script
General
Full URL
https://dkuim.de/api/js/2/dkuim.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.65.130 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
72079e05e49316d0245e16904460e88a8001bfd320327e1de68dac8d12a89114

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
Content-Encoding
gzip
Last-Modified
Wed, 19 Feb 2020 20:17:12 GMT
Server
nginx
ETag
W/"5e4d97c8-74483"
Transfer-Encoding
chunked
Content-Type
application/javascript
smb-phone-plan-ef34ebe4f8.js
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
53 KB
18 KB
Script
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/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Wed, 11 Sep 2019 09:34:55 GMT
content-encoding
gzip
x-original-content-length
54000
server
nginx
status
200
etag
W/"5d78bf3c-d2f0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
18237
expires
Thu, 10 Sep 2020 09:34:55 GMT
bid
c.amazon-adsystem.com/e/dtb/
107 B
493 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=Gjn8ESw4oOrnf&cb=0&ws=1600x1200&v=7.47.00&t=1000&slots=%5B%7B%22sd%22%3A%220%22%2C%22s%22%3A%5B%22728x90%22%2C%22800x250%22%2C%22970x250%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%221%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%222%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%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
143.204.90.242 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-90-242.fra50.r.cloudfront.net
Software
Server /
Resource Hash
9694d72e65a5b488a1e18d166970ab73de4848e18766fee7634d803cef4cc8f7

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA50-C1
status
200
vary
Accept-Encoding,User-Agent
x-cache
Miss from cloudfront
content-type
text/javascript;charset=UTF-8
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
timing-allow-origin
*
content-length
118
via
1.1 5721f7035c3fc934bd3f96dbb04ba1e5.cloudfront.net (CloudFront)
x-amz-cf-id
rZST6A1tTPHxECf_WahxQY2It8g8kmlv9bny0YGTFYCSYZdGGEKj0Q==
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.90.242 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-90-242.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 05:48:44 GMT
content-encoding
gzip
vary
Origin
age
1777
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Wed, 08 Jan 2020 04:09:03 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 ef13dd533b8dc9dcfdc35449cf88f808.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA50-C1
x-amz-cf-id
eNC3jnCJtY483ab9wL6tWkaD3qEGY-tNAB_knRlNG6NbPT2C_uGBbA==
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=visible&el=4282584&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd21=auto&cm18=1&z=381964787
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581074
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
amazon-payments-rct415x210u.jpg
static.giga.de/wp-content/uploads/2011/04/
10 KB
10 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2011/04/amazon-payments-rct415x210u.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
d665ad6762076513f3ad8d02bc1246a6bcf75d4df5da456aae49976b2243adf7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Wed, 04 Mar 2020 10:01:49 GMT
x-content-type-options
nosniff
age
72935
filer-source
9fcbfe0609ec317617f527360c0b15c3facbc88fbf843eebc5f9a52266d8cc02
x-cache
HIT
status
200
accept-language
bytes
content-length
10096
x-xss-protection
1; mode=block
last-modified
Wed, 04 Mar 2020 10:01:49 GMT
server
nginx/1.10.3
filer-attr
W1s0MTUsMjEwXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Fri, 03 Apr 2020 10:01:49 GMT
Wie-funktioniert-Sofortueberweisung-Anleitung-rct200x210u.png
static.giga.de/wp-content/uploads/2015/06/
7 KB
8 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/06/Wie-funktioniert-Sofortueberweisung-Anleitung-rct200x210u.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.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
dd93ca83e5a29b494b970f63833ffec494690063a0ef5bafca4c4d9c889e5fdc
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Wed, 04 Mar 2020 10:10:01 GMT
x-content-type-options
nosniff
age
72442
filer-source
3beffb1146514dda059aab417235b82390e75450ec34067a45c5b02a4ce9e391
x-cache
HIT
status
200
accept-language
bytes
content-length
7511
x-xss-protection
1; mode=block
last-modified
Wed, 04 Mar 2020 10:10:01 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMjEwXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Fri, 03 Apr 2020 10:10:01 GMT
jquery.min.js
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
85 KB
30 KB
Script
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/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Wed, 05 Feb 2020 05:24:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
2508795
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
30306
x-xss-protection
0
last-modified
Fri, 24 Mar 2017 20:55:54 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
public, max-age=31536000, stale-while-revalidate=2592000
accept-ranges
bytes
timing-allow-origin
*
expires
Thu, 04 Feb 2021 05:24:08 GMT
kwiss-69d2e3a105.js
www.giga.de/static-local/dist/assets/js/components/
5 KB
2 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/components/kwiss-69d2e3a105.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8beb904f67cc6daaa4d6d22518152461f640b003b4accab3b705bb2cb92e8230

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Tue, 05 Nov 2019 09:59:32 GMT
content-encoding
gzip
x-original-content-length
4933
server
nginx
status
200
etag
W/"5dc147a5-1345"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2095
expires
Wed, 04 Nov 2020 09:59:32 GMT
article-rating-7143c629e5.js
www.giga.de/static-local/dist/assets/js/components/
306 B
534 B
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/components/article-rating-7143c629e5.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Wed, 27 Mar 2019 21:57:05 GMT
content-encoding
gzip
x-original-content-length
306
server
nginx
accept-language
bytes
status
200
etag
"5c9a4313-132"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
234
expires
Thu, 26 Mar 2020 21:57:05 GMT
loader.js
c.nativendo.de/cdn/asset/js/
56 KB
18 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1188
Requested by
Host: d.nativendo.de
URL: https://d.nativendo.de/cds/delivery/init
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:5fb , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
b7423f3ee15c4bef2886b80f5db2fa16bac4245f4a88d6efbf9c209f66e36817

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
via
1.1 google
cf-cache-status
HIT
age
591496
cf-polished
origSize=57179
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=31536000
cf-ray
56f1b6b35d6c3264-FRA
expires
Fri, 26 Feb 2021 09:59:07 GMT
videojs-c972511a.min.js
videos.giga.de/dist/js/embed/bundle/ Frame 73F9
619 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875
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
4532f79dd4221b45bb4f0008abce433420eeb875e88a9ea119063b90adbb6cb5

Request headers

Referer
https://videos.giga.de/embed/176875
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
last-modified
Fri, 14 Feb 2020 09:20:49 GMT
server
nginx/1.14.1
etag
W/"5e466671-9aae0"
content-type
application/javascript
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/ Frame 73F9
264 KB
90 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
9d66c3c06c07f63e93d64db5ada1034094f71ab1bcfc6d0d7d6034d78aeda881
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://videos.giga.de/embed/176875
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
91755
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:23 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 0E5C
0
0
Document
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=1583389043&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1583389043622&bpp=14&bdt=227&fdt=104&idt=104&shv=r20200303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=5072409614088&frm=20&pv=2&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&ga_fc=0&iag=0&icsg=13210925151038&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=318&ady=450&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=4221733706430658&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=upU0N5Urlg&p=https%3A//www.giga.de&dtd=121
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200303/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:818::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1459277723&w=468&lmt=1583389043&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1583389043622&bpp=14&bdt=227&fdt=104&idt=104&shv=r20200303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=5072409614088&frm=20&pv=2&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&ga_fc=0&iag=0&icsg=13210925151038&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=318&ady=450&biw=1585&bih=1200&scr_x=0&scr_y=0&oid=3&pvsid=4221733706430658&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=upU0N5Urlg&p=https%3A//www.giga.de&dtd=121
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Thu, 05 Mar 2020 06:17:24 GMT
server
cafe
content-length
27696
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Thu, 05-Mar-2020 06:32:23 GMT; path=/; domain=.doubleclick.net; Secure; SameSite=none
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Thu, 05 Mar 2020 06:17:24 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
73 KB
27 KB
Script
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/r20200303/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
88b230f7cc8dcdf4ac2d71c5537f063d2be6b51ecf10df6ba04bb53a0062b9f2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1583324508270956"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
27646
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:23 GMT
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame 73F9
53 KB
15 KB
Stylesheet
General
Full URL
https://videos.giga.de/dist/css/videojs-f50f7a8d.css
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875
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
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813

Request headers

Referer
https://videos.giga.de/embed/176875
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
style

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
last-modified
Fri, 14 Feb 2020 09:20:49 GMT
server
nginx/1.14.1
etag
W/"5e466671-d280"
content-type
text/css
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
play_button.svg
videos.giga.de/image/ Frame 73F9
1015 B
1 KB
Image
General
Full URL
https://videos.giga.de/image/play_button.svg
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875
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
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913

Request headers

Referer
https://videos.giga.de/embed/176875
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
"5d1db79a-3f7"
content-type
image/svg+xml
status
200
cache-control
max-age=7776000
accept-ranges
bytes
content-length
1015
expires
Wed, 03 Jun 2020 06:17:23 GMT
dmp
tracking.m6r.eu/sync/
97 B
620 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
6961765a4f1a44837db3a12530e74a1acd03ef3e70366f0be03b9e7e2d650d0e

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
106
ads
googleads.g.doubleclick.net/pagead/ Frame BC4F
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1583389043&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1583389043677&bpp=5&bdt=281&fdt=102&idt=102&shv=r20200303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=5072409614088&frm=20&pv=1&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&ga_fc=0&iag=0&icsg=13210925151038&dssz=68&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&oid=3&pvsid=4221733706430658&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=113
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200303/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:818::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1583389043&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1583389043677&bpp=5&bdt=281&fdt=102&idt=102&shv=r20200303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=5072409614088&frm=20&pv=1&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&ga_fc=0&iag=0&icsg=13210925151038&dssz=68&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&oid=3&pvsid=4221733706430658&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=113
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
date
Thu, 05 Mar 2020 06:17:23 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Thu, 05-Mar-2020 06:32:23 GMT; path=/; domain=.doubleclick.net; Secure; SameSite=none
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Thu, 05 Mar 2020 06:17:23 GMT
cache-control
private
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Quiz%20Teaser%202017&ea=embed&el=01afe2c2-c1b4-48d2-948d-59a2d9b73b9b&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd20=01afe2c2-c1b4-48d2-948d-59a2d9b73b9b&cd25=auto&cd27=SurveyQuestion&cm53=1&z=463609115
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581074
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
loader.js
cdn.taboola.com/libtrc/stroeer-smb-giga/
199 KB
29 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/bundle/post-4661cc0bdf.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
fdc67ef7708016ab64a6645f0a07c349c31f8dde9934d21f13083f3e3241fb72

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
uvtjryYhCqSIANM1_plM4UFQ1BcOqU51
content-encoding
gzip
age
26
x-cache
HIT
status
200
date
Thu, 05 Mar 2020 06:17:23 GMT
content-length
29448
x-amz-id-2
ydzB/jEH1ae2RUhSDuurbZPjxVvL55P97+HuRNytkZwbmnm7pjAfQjavjdKRZiYutyiQa6g6Dqc=
x-served-by
cache-hhn4022-HHN
last-modified
Wed, 04 Mar 2020 09:33:45 GMT
server
AmazonS3
x-timer
S1583389044.842175,VS0,VE0
etag
"e21dd9cf065b1b22bb16f3b8489459be"
vary
Accept-Encoding
x-amz-request-id
632A53F0DFB637D6
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
57
x-cache-hits
2
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cd45=all&cm75=1&z=2018870193
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581074
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cd45=all&cm75=1&z=1835039826
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581074
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cd45=all&cm75=1&z=1951221832
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581074
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cd45=all&cm75=1&cd39=Image&z=1375673850
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581074
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cd45=all&cm75=1&z=1690338649
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581074
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cd45=all&cm75=1&z=1876497860
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581074
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
96 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cd45=all&cm75=1&z=268119679
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581074
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
pixel.gif
static.criteo.net/images/
43 B
260 B
Image
General
Full URL
https://static.criteo.net/images/pixel.gif?ch=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a02:2638::3 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
last-modified
Tue, 09 Dec 2008 16:52:36 GMT
server
nginx
access-control-allow-origin
*
etag
"493ea254-2b"
content-type
image/gif
status
200
cache-control
max-age=31104000, public
accept-ranges
bytes
timing-allow-origin
*
content-length
43
expires
Sun, 28 Feb 2021 06:17:23 GMT
pixel.gif
static.criteo.net/images/
43 B
260 B
Image
General
Full URL
https://static.criteo.net/images/pixel.gif?ch=2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a02:2638::3 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
last-modified
Tue, 09 Dec 2008 16:52:36 GMT
server
nginx
access-control-allow-origin
*
etag
"493ea254-2b"
content-type
image/gif
status
200
cache-control
max-age=31104000, public
accept-ranges
bytes
timing-allow-origin
*
content-length
43
expires
Sun, 28 Feb 2021 06:17:23 GMT
smb-article-rating-f9506c2d61.min.js
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
18 KB
6 KB
Script
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/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Mon, 20 May 2019 10:19:29 GMT
content-encoding
gzip
x-original-content-length
17937
server
nginx
status
200
etag
W/"5ce27eb5-4611"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
6108
expires
Tue, 19 May 2020 10:19:29 GMT
kwissc.js
quiz.stroeermediabrands.de/static/client/
227 KB
80 KB
Script
General
Full URL
https://quiz.stroeermediabrands.de/static/client/kwissc.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
46.253.113.181 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c872510d9beca2adca7dc000239c71c9d54c03f3fc805833a661de6a23a2e4ec

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

status
200
date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
last-modified
Thu, 27 Feb 2020 07:24:17 GMT
server
nginx
etag
W/"5e576ea1-38de5"
content-type
application/javascript
doT.min.js
cdnjs.cloudflare.com/ajax/libs/dot/1.0.3/
3 KB
2 KB
Script
General
Full URL
https://cdnjs.cloudflare.com/ajax/libs/dot/1.0.3/doT.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700::6811:4104 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
d032695018480726794e6e6eff112f7116a5122bb269d22dc77f3516604a1c1e
Security Headers
Name Value
Strict-Transport-Security max-age=15780000; includeSubDomains

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
br
cf-cache-status
HIT
age
1746922
cf-ray
56f1b6b42fe53250-FRA
status
200
strict-transport-security
max-age=15780000; includeSubDomains
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
last-modified
Thu, 17 May 2018 09:18:46 GMT
server
cloudflare
etag
W/"5afd48f6-d2e"
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
expires
Tue, 23 Feb 2021 06:17:23 GMT
cache-control
public, max-age=30672000
timing-allow-origin
*
served-in-seconds
0.001
bootstrap.min.js
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
36 KB
10 KB
Script
General
Full URL
https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2001:4de0:ac19::1:b:1a , Netherlands, ASN20446 (HIGHWINDS3, US),
Reverse DNS
Software
/
Resource Hash
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
last-modified
Wed, 12 Dec 2018 18:33:51 GMT
access-control-allow-origin
*
etag
"1544639631"
vary
Accept-Encoding
x-cache
HIT
content-type
text/javascript; charset=utf-8
status
200
cache-control
public, max-age=31536000
x-hello-human
Say hello back! @getBootstrapCDN on Twitter
accept-ranges
bytes
timing-allow-origin
*
content-length
9832
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=89ceb345-90db-4a47-a654-84bb00b8ca2c&smb_sp=&smb_ch=software
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
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
ba858de50dbe28aca66d51f275b0e7a2be3dae6ee1c6e74798b4655575a897bc

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Thu, 05 Mar 2020 06:17:23 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1518
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__ir=&__is=1600_1200_24&__iu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&__id=1583389043886&__it=-60&__ic=727391&__iq=ebe1747b80ed5166ae77b1018b0ac49f&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:23 GMT
Last-Modified
Fri, 26 Feb 2010 06:15:28 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Thu, 28 Feb 2013 06:15:28 GMT
pubads_impl_2020022701.js
securepubads.g.doubleclick.net/gpt/
164 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
sffe /
Resource Hash
dfc3f558d7ab9659f6fc3a1c61fa7c5c6c905adecd8bff069652254c13f84b9b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 27 Feb 2020 14:08:10 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
61148
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:23 GMT
session
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/session
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
35.156.162.45 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-35-156-162-45.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Thu, 05 Mar 2020 06:17:23 GMT
submit
lb46.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb46.s400.meetrics.net/bb-mx/submit?/K06kBSAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSr+APAAAAAAAAAOAAAAGBAAAAAAZwSr+ABRksFAQtjF6o7BTA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:24 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Thu, 05 Mar 2020 06:17:23 GMT
data
lb46.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb46.s400.meetrics.net/data?/K06kCTAAATkzFARksFAQtjFBqJNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:24 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 05-Mar-20 06:17:23 GMT
nuggad
ih.adscale.de/
49 B
283 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=1&d10=1&d2=6&d4=1&d11=2&d8=2&d9=1&d12=3&d1=1&d3=3
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.185.150.7 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-185-150-7.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

status
200
date
Thu, 05 Mar 2020 06:17:24 GMT
server
Apache-Coyote/1.1
p3p
CP=NOI PSA OUR
content-length
49
content-type
image/gif
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=1&n116=0&n104=1&n15=2&n155=1&n135=6&n106=0&n153=0&n11=1&n120=2&n154=1&n125=1&n8=1&n2=6&n137=0&n101=0&n108=1&n54=0&n110=1&n87=0&n149=0&n76=1&n66=0&n60=1&n139=1&n160=0&n107=1&n21=1&n40=1&n117=4&n86=0&n147=4&n64=0&n119=3&n22=1&n18=1&n161=1&n126=0&n92=3&n57=1&n77=0&n83=0&n102=1&n105=0&n159=1&n20=1&n80=1&n12=1&n141=0&n157=0&n99=1&n128=1&n118=3&n85=0&n9=2&n6=2&n63=0&n58=1&n138=0&n140=0&n94=2&n111=1&n136=0&n79=1&n93=4&n90=0&n142=0&n7=1&n103=1&n158=0&n124=0&n75=0&n91=0&n114=0&n69=0&n47=1&n10=3&n3=1&n82=1&n84=0&n5=3&n109=0&n122=1&n67=1&n115=1&n89=1&n123=2&n17=1&n78=0&n44=1&n81=1&n88=0&n39=1&n156=0&n148=1&n133=1
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
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
3786b76d0a2f48f6cf804db8b9779095c2b97d335f7000863b9d19a1d46a2d62

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Thu, 05 Mar 2020 06:17:24 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1472
nativendo.css
c.nativendo.de/cdn/asset/css/
6 KB
2 KB
Stylesheet
General
Full URL
https://c.nativendo.de/cdn/asset/css/nativendo.css?v=1188
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1188
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:5fb , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
d9d50f91b9fa32568a08b88e9758859316046c7ee530542cf3a7dd6bd334d657

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
style

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
via
1.1 google
cf-cache-status
HIT
age
591497
cf-polished
origSize=7333
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
text/css;charset=UTF-8
cache-control
public, max-age=31536000
cf-ray
56f1b6b509023264-FRA
expires
Fri, 26 Feb 2021 09:59:07 GMT
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/ Frame 73F9
30 KB
30 KB
Image
General
Full URL
https://files.giga-video.de/75/ed/96/145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://videos.giga.de/embed/176875
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Tue, 25 Feb 2020 06:16:27 GMT
x-content-type-options
nosniff
age
777657
filer-source
ce88ec61ef2b0ae3c6dce1f364e04b3dccdbf411589c67a9af3271f22f2780da
x-cache
HIT
status
200
accept-language
bytes
content-length
30682
x-xss-protection
1; mode=block
last-modified
Sun, 02 Feb 2020 09:20:41 GMT
server
nginx/1.10.3
filer-attr
W1s2NTAsMzY2XSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Tue, 03 Mar 2020 09:20:41 GMT
ForumViewTopicContentAD.Cj3s-YOGFGen4.png
www.giga.de/special/gutscheine/
71 B
273 B
Image
General
Full URL
https://www.giga.de/special/gutscheine/ForumViewTopicContentAD.Cj3s-YOGFGen4.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx / TSAdServer
Resource Hash
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Thu, 05 Mar 2020 06:17:23 GMT
server
nginx
x-powered-by
TSAdServer
etag
W/"47-ZTbJFDBdJipLHHeF7Zqsus3A1Hc"
content-type
image/png
status
200
cache-control
no-cache, no-store, must-revalidate
x-robots-tag
noindex, nofollow
content-length
71
collect
www.google-analytics.com/
35 B
102 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=12&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.6%5D%5BUser%20Click2Play%5D&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.6&cd44=1&cm1=1&z=857859608
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581075
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
dd40974c-3bd7-44a9-8e9b-8ed96f01064a
https://videos.giga.de/ Frame 73F9
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/dd40974c-3bd7-44a9-8e9b-8ed96f01064a
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
worker

Response headers

Content-Length
31
Content-Type
application/javascript
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 73F9
53 B
703 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.74.159 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Referer
https://videos.giga.de/embed/176875
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:25 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
F96E7E89DD519D2E
Content-Length
53
x-amz-id-2
KlGjHYFnVBpHjZ2EWD0VoaStJpRCzU+ywMfBN4+KmOW1ZV6sbI7IQX2C64gG/mSecBj7TU0oWhs=
Last-Modified
Thu, 05 Mar 2020 04:55:23 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 73F9
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
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

Request headers

Referer
https://videos.giga.de/embed/176875
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Thu, 05 Mar 2020 06:32:24 GMT
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame E736
Redirect Chain
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
0
0
Document
General
Full URL
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&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.216.48 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Server /
Resource Hash

Request headers

Host
aax-eu.amazon-adsystem.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Cookie
ad-id=A_tmOFuaQUQEtNxclpqpOUY|t
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Server
Date
Thu, 05 Mar 2020 06:17:24 GMT
Content-Type
text/html;charset=ISO-8859-1
Content-Length
183
Connection
keep-alive
Cache-Control
max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0
Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p3p
policyref="https://www.amazon.com/w3c/p3p.xml", CP="PSAo PSDo OUR SAM OTR DSP COR"
Set-Cookie
ad-id=A_tmOFuaQUQEtNxclpqpOUY; Domain=.amazon-adsystem.com; Expires=Thu, 01-Oct-2020 06:17:24 GMT; Path=/; Secure; HttpOnly; SameSite=None ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Tue, 01-Apr-2025 06:17:24 GMT; Path=/; Secure; HttpOnly; SameSite=None
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Thu, 05 Mar 2020 06:17:24 GMT
Content-Length
0
Connection
keep-alive
Cache-Control
max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0
Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p3p
policyref="https://www.amazon.com/w3c/p3p.xml", CP="PSAo PSDo OUR SAM OTR DSP COR"
Location
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
Set-Cookie
ad-id=A_tmOFuaQUQEtNxclpqpOUY|t; Domain=.amazon-adsystem.com; Expires=Thu, 01-Oct-2020 06:17:24 GMT; Path=/; Secure; HttpOnly; SameSite=None
Vary
User-Agent
impl.20200304-8-RELEASE.js
cdn.taboola.com/libtrc/
444 KB
126 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20200304-8-RELEASE.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
923d64598979239fdb6ca32f8965b8de89cc12826e0db7de011889f17d89fb08

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
qF1SsPUf6_FvVw872MMkCfFZT_0vksjP
content-encoding
gzip
age
68
x-cache
HIT
status
200
date
Thu, 05 Mar 2020 06:17:24 GMT
x-amz-replication-status
COMPLETED
content-length
128405
x-amz-id-2
hiKMtq16k1u3mm+Ev0PVJcOBTWIJ/bpoFjciEIuZWDEYQZsmZiVl0vwdDSeU1yaUnMg2IMENYts=
x-served-by
cache-hhn4022-HHN
last-modified
Wed, 04 Mar 2020 09:25:31 GMT
server
AmazonS3
x-timer
S1583389044.102924,VS0,VE0
etag
"6310546834435f3b0777fe9e6e372640"
vary
Accept-Encoding
x-amz-request-id
5ECACA614C7AD1ED
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
30
x-cache-hits
603
beacon.js
sb.scorecardresearch.com/
1 KB
1 KB
Script
General
Full URL
https://sb.scorecardresearch.com/beacon.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.43.115.95 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-43-115-95.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a256529bd5b1b8846f8d2536ce7581fb6cea4479992f222d01535903dff48d79

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Thu, 05 Mar 2020 06:17:24 GMT
Content-Encoding
gzip
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
private, no-transform, max-age=86400
Connection
keep-alive
Content-Length
884
Expires
Fri, 06 Mar 2020 06:17:24 GMT
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=886c72288fc395da52cf164886d37815&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D886c72288fc395da52cf164886d37815%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=886c72288fc395da52cf164886d37815&userId=adscale-user:d1136d32b0c44146805631960db8a8b8
44 B
574 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=886c72288fc395da52cf164886d37815&userId=adscale-user:d1136d32b0c44146805631960db8a8b8
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:24 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

status
307
date
Thu, 05 Mar 2020 06:17:24 GMT
server
Apache-Coyote/1.1
content-length
0
location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=886c72288fc395da52cf164886d37815&userId=adscale-user:d1136d32b0c44146805631960db8a8b8
p3p
CP=NOI PSA OUR
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=61ea3ca9ef64d8973baa907809a0b408
43 B
873 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=61ea3ca9ef64d8973baa907809a0b408
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.209 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
314.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:26 GMT
AN-X-Request-Uuid
e8134776-97ba-4d60-8ba1-fff8ab3e6b47
Content-Type
image/gif
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Cache-Control
no-store, no-cache, private
Connection
keep-alive
X-Proxy-Origin
82.102.19.134; 82.102.19.134; 314.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.222.237:80
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Location
https://ib.adnxs.com/setuid?entity=197&code=61ea3ca9ef64d8973baa907809a0b408
Date
Thu, 05 Mar 2020 06:17:24 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
98
Content-Type
text/plain; charset=utf-8
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=iGxyKI_DldpSzxZIhtN4FQ
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
44 B
569 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:24 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:24 GMT
server
HTTP server (unknown)
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
260
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
m
ad.yieldlab.net/
Redirect Chain
  • https://tracking.m6r.eu/sync/yieldlabRedirect
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=61ea3ca9ef64d8973baa907809a0b408
0
360 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=61ea3ca9ef64d8973baa907809a0b408
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.16.122.151 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-16-122-151.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:24 GMT
x-content-type-options
nosniff
x-frame-options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
x-xss-protection
1; mode=block
x-application-context
application
Expires
Wed, 04 Mar 2020 06:17:24 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=61ea3ca9ef64d8973baa907809a0b408
Date
Thu, 05 Mar 2020 06:17:24 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
99
Content-Type
text/plain; charset=utf-8
bid
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/bid
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
35.156.162.45 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-35-156-162-45.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Thu, 05 Mar 2020 06:17:24 GMT
auction
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/auction
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
35.156.162.45 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-35-156-162-45.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Thu, 05 Mar 2020 06:17:24 GMT
ads
securepubads.g.doubleclick.net/gampad/
3 KB
2 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4221733706430658&correlator=1279517699276274&output=ldjh&impl=fif&adsid=NT&eid=21064212%2C21065575&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=1x1&ists=1&prev_scp=as%3Dout_of_page%26adslot%3Dout_of_page%26af%3Dds%2Ctickerad%2Cfloor%26pc%3D1&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D11%26smb-hour%3D7%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D886c72288fc395da52cf164886d37815%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-6%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-1%252Cn21-1%252Cn40-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-2%252Cn6-2%252Cn63-0%252Cn58-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-1%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-0%252Cn142-0%252Cn7-1%252Cn103-1%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-0%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-1%252Cn133-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1583389044&dt=1583389044200&dlt=1583389043395&idt=773&frm=20&biw=1585&bih=1200&oid=3&adxs=0&adys=3879&adks=2540211652&ucis=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%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=79&icsg=1100062243357216&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x1&msz=1585x1&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&fws=0&ohw=0&btvi=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
cafe /
Resource Hash
e4e5ee42d5bf59640b6c8cc1429b54065f5c71df4b1bb4d48fd7263e752d2f21
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
1815
x-xss-protection
0
google-lineitem-id
4482388292
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138216245372
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2020022701.js
securepubads.g.doubleclick.net/gpt/
69 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
sffe /
Resource Hash
8b81c098f8cd1362848b2d9b10a139bbf07ed1aa0411712c7d502d31a1734506
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 27 Feb 2020 14:08:10 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
25762
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

ads
securepubads.g.doubleclick.net/gampad/
8 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4221733706430658&correlator=1279517699276274&output=ldjh&impl=fif&adsid=NT&eid=21064212%2C21065575&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C31x31&prev_scp=as%3Dbanner%26adslot%3Dbanner%26af%3Dds%2Cf2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cvto%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A20918.scenario%253Adefault%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D11%26smb-hour%3D7%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D886c72288fc395da52cf164886d37815%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-6%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-1%252Cn21-1%252Cn40-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-2%252Cn6-2%252Cn63-0%252Cn58-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-1%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-0%252Cn142-0%252Cn7-1%252Cn103-1%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-0%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-1%252Cn133-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1583389044&dt=1583389044218&dlt=1583389043395&idt=773&frm=20&biw=1585&bih=1200&oid=3&adxs=293&adys=125&adks=1727577002&ucis=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%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=80&icsg=1100062243357216&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x10&msz=1000x10&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&fws=0&ohw=0&btvi=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
cafe /
Resource Hash
94ee2b6f661c7f0859d383dc0ee7d8a6abd81ae9b1db4c74a19a03360782fbea
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3540
x-xss-protection
0
google-lineitem-id
5303510603
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138303782938
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
8 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4221733706430658&correlator=1279517699276274&output=ldjh&impl=fif&adsid=NT&eid=21064212%2C21065575&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&prev_scp=as%3Dsky%26adslot%3Dsky%26af%3Dfirepl%2Cwp%2Cvidwa%2Cf1x4%2Cf1x3%2Cf1x2%2Cds%2Cdds%2Csky%2Chpad%2Cband%26rfree%3D200-299%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A19051.scenario%253Adefault%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D11%26smb-hour%3D7%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D886c72288fc395da52cf164886d37815%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-6%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-1%252Cn21-1%252Cn40-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-2%252Cn6-2%252Cn63-0%252Cn58-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-1%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-0%252Cn142-0%252Cn7-1%252Cn103-1%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-0%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-1%252Cn133-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1583389044&dt=1583389044225&dlt=1583389043395&idt=773&frm=20&biw=1585&bih=1200&oid=3&adxs=1318&adys=125&adks=2778923653&ucis=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%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=80&icsg=1100062243357216&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=10x40&msz=10x40&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&fws=0&ohw=0&btvi=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
cafe /
Resource Hash
3b142ebd13e469a013283908b7b1ea8c24126fcc1e1e94d6a7fc57efcd8d3ff8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3546
x-xss-protection
0
google-lineitem-id
5302344717
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138303417425
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
8 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4221733706430658&correlator=1279517699276274&output=ldjh&impl=fif&adsid=NT&eid=21064212%2C21065575&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=4444%2Cgiga.de_sd%2Csoftware_artikel&enc_prev_ius=0%2F1%2F2&prev_iu_szs=10x20%7C10x10%7C300x250%7C34x31&prev_scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9501.scenario%253Adefault%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D11%26smb-hour%3D7%26mtrcskv%3D50-1_75%252C50-1_100%252C60-1_100%252C65-1_75%252C70-1_75%252C70-2_100%252C80-1_75%252C80-2_100%252C100-1_75%252C100-2_100%26yt%3D0%26adset%3Dbrsl%26mbrid%3D886c72288fc395da52cf164886d37815%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-2%252Cn155-1%252Cn135-6%252Cn106-0%252Cn153-0%252Cn11-1%252Cn120-2%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-6%252Cn137-0%252Cn101-0%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-0%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-1%252Cn21-1%252Cn40-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-0%252Cn92-3%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-1%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-2%252Cn6-2%252Cn63-0%252Cn58-1%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-1%252Cn136-0%252Cn79-1%252Cn93-4%252Cn90-0%252Cn142-0%252Cn7-1%252Cn103-1%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-0%252Cn114-0%252Cn69-0%252Cn47-1%252Cn10-3%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-3%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-1%252Cn133-1%26keywords%3D%26amznbid%3D0%26amznp%3D0&cookie_enabled=1&bc=31&abxe=1&lmt=1583389044&dt=1583389044233&dlt=1583389043395&idt=773&frm=20&biw=1585&bih=1200&oid=3&adxs=968&adys=265&adks=1428895410&ucis=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%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=80&icsg=1100062243357216&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x20&msz=300x20&ga_vid=468571453.1583389044&ga_sid=1583389044&ga_hid=2108822051&fws=0&ohw=0&btvi=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
cafe /
Resource Hash
7e7eeed9bbaf12534f8daf84968ea468d995221e958545e42f4afa6626afdef6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3500
x-xss-protection
0
google-lineitem-id
5303510597
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138303416771
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 73F9
754 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.32 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-101-32.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb

Request headers

Referer
https://videos.giga.de/embed/176875
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:03 GMT
Via
1.1 9c7c26f5beeb09381cea450ea3581b37.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
22
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
754
Last-Modified
Wed, 22 Jan 2020 03:58:13 GMT
Server
AmazonS3
ETag
"b7cafd7f52366c401d1297c997d1b09d"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA50-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
nlg5kKBo-kcOe159im8VXQHH8oU7Y8SnnAF0eYaInarKwde8NVaWBw==
Expires
0
config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
36 KB
9 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
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_128_GCM
Server
151.101.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
6416f0b75099e189728351765dc9b86da8d6456aa5f8d5f4176aac99dbe36eef

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Thu, 05 Mar 2020 06:17:24 GMT
Content-Encoding
gzip
Age
3144
X-Cache
HIT
Connection
keep-alive
Content-Length
8188
x-amz-id-2
Y6ucClmA4p00rf/pK1VAEe/SwDNZXu4WAgzivNlEMtDeeMmiZ0DR0r4hWolFAu3kphBaxDKxnw4=
X-Served-By
cache-fra19183-FRA
Last-Modified
Wed, 04 Mar 2020 23:27:28 GMT
Server
AmazonS3
X-Timer
S1583389044.337358,VS0,VE0
ETag
"04d486039e62d834c81702f8203a8649"
x-amz-request-id
66C079106ACC2A39
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
5393
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=61ea3ca9ef64d8973baa907809a0b408&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D61ea3ca9ef64d8973baa907809a0b408%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=61ea3ca9ef64d8973baa907809a0b408&userId=adscale-user:d1136d32b0c44146805631960db8a8b8
44 B
574 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=61ea3ca9ef64d8973baa907809a0b408&userId=adscale-user:d1136d32b0c44146805631960db8a8b8
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:24 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

status
307
date
Thu, 05 Mar 2020 06:17:24 GMT
server
Apache-Coyote/1.1
content-length
0
location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=61ea3ca9ef64d8973baa907809a0b408&userId=adscale-user:d1136d32b0c44146805631960db8a8b8
p3p
CP=NOI PSA OUR
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=Yeo8qe9k2Jc7qpB4CaC0CA
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
44 B
569 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:24 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:24 GMT
server
HTTP server (unknown)
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
260
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
d.nativendo.de/cds/delivery/get/
2 KB
1 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/get/?url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1188
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
b94da20440317fec9c46406aa39cd2e8aebbdb377bbb56c3b9bd5a3c2abf1af7

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
last-modified
Thu, 05 Mar 2020 06:17:24 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
699
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
b2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1583389044284&ns_c=UTF-8&cv=3.5&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%...
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1583389044284&ns_c=UTF-8&cv=3.5&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1583389044284&ns_c=UTF-8&cv=3.5&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.43.115.95 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-43-115-95.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:24 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT

Redirect headers

Location
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1583389044284&ns_c=UTF-8&cv=3.5&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:24 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame 14EA
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss_ond604jtIed4RQtquEAB2WIkDvAkFII3VhhxxKcn7XgPULG0W3bZn_UuT88xaJO77hvVLqgaBp-zhAy8L4gnRX1F_YSW3NfiqdfdM89Y0Y-koDLu4eFP04yPzvLiZFmPtsr3By0pC...
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
49 B
343 B
Image
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:eb:181::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
access-control-allow-origin
*
etag
"3260aadd174a1ebd50d0bd967c8fadea:1494950026"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
status
200
cache-control
max-age=504026
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Wed, 11 Mar 2020 02:17:50 GMT

Redirect headers

date
Thu, 05 Mar 2020 06:17:24 GMT
x-content-type-options
nosniff
content-type
text/html; charset=UTF-8
server
cafe
access-control-allow-origin
*
location
//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
json
trc.taboola.com/stroeer-smb-giga/trc/3/
17 KB
7 KB
Script
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=07%3A17%3A24.340&lti=deflated&data=%7B%22id%22%3A127%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1583389043796%2C%22cv%22%3A%2220200304-8-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%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%3A3901%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%3A3218.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.20200304-8-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
8bb09124900f5a4358b9d696d5723f9c495bc5e0d0966b2a097efc2f575c8947

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-vcl-time-ms
146
date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
status
200
via
1.1 varnish
x-served-by
cache-fra19125-FRA
server
nginx
x-timer
S1583389044.396075,VS0,VE146
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
pixel
tracking.m6r.eu/consent/
44 B
209 B
Image
General
Full URL
https://tracking.m6r.eu/consent/pixel?nocookie=true&nosync=true&consent=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Date
Thu, 05 Mar 2020 06:17:24 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/202003031018/
32 KB
12 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/202003031018/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, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
31f25dee720c1cc57694de1ed117f8a5b34c0899c453223cde12bbcab7518416

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Thu, 05 Mar 2020 06:17:24 GMT
Content-Encoding
gzip
Age
252
X-Cache
HIT
Connection
keep-alive
Content-Length
12024
x-amz-id-2
HLPJdIgx6NsNutNMfIZ7sbfBZe4yunAF8gvHb8NwvJHluundGmgEUhnkH7NYszi1hDCYdnl8HL4=
X-Served-By
cache-fra19183-FRA
Last-Modified
Tue, 03 Mar 2020 17:14:32 GMT
Server
AmazonS3
X-Timer
S1583389044.368349,VS0,VE0
ETag
"5d9f45421c8ea9e676a2a26194dd41f9"
x-amz-request-id
E132477EB465B39A
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
363
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame 73F9
200 KB
58 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=ZNjDKjpeGi
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.32 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-101-32.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
60102f26830f95c37963a8ab7609098e932d2b6915cc9396ee9c585fda650296

Request headers

Referer
https://videos.giga.de/embed/176875
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:16:46 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
62
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
https://videos.giga.de
Last-Modified
Mon, 02 Mar 2020 09:29:40 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 9c7c26f5beeb09381cea450ea3581b37.cloudfront.net (CloudFront)
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA50-C1
X-Amz-Cf-Id
GIYPDhKBxOaroMYfW05edCPAaBOAiL9m3NJJ_l7RUMz6PaGXbQAGmg==
truncated
/ Frame 73F9
200 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60102f26830f95c37963a8ab7609098e932d2b6915cc9396ee9c585fda650296

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
text/javascript
view
securepubads.g.doubleclick.net/pcs/ Frame B57A
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssLn-wmH-snpxkx3ENNR9976cFD2BBIPakdzMbrr9-JqWqIBVfD6fqUAjOq9XSbAww8j17k4sc90n6EsbPEOIKBe-oESnUkQn0UDNA4Law9pskxnyg1jU0F6Zr-vblMB2izaY2n3Ko_ekvd3MAhrsXJ4MDwU3yjSJE6N90itIwHrdslZX_tj-iVM-cEY-pJbKufHkEt6T5FlK8beRAfYn8qhM8P5p17y-8hiCq2RB-E2vyyiZHsvEoFcLLzq00nYb6Zzmeckm9LHpQAlwmr&sig=Cg0ArKJSzNXaQN2X1NuVEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

timing-allow-origin
*
date
Thu, 05 Mar 2020 06:17:24 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
www.googletagservices.com/tag/js/ Frame B57A
43 KB
14 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
993b9c17cd76897fc81ff978ff0b7b7272567897cf7ddd1f26d20e778f1c70e7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"447 / 259 of 1000 / last-modified: 1583259544"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14516
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame B57A
73 KB
28 KB
Script
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_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
31eef561438773aa8905d73dfe2e8400eca13620146d6235c6e019a828bd33fe
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1583324508270956"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
28126
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
5303510603
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5303510603
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
52.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5303510603
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
pubads_impl_2020022701.js
securepubads.g.doubleclick.net/gpt/ Frame B57A
164 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
sffe /
Resource Hash
dfc3f558d7ab9659f6fc3a1c61fa7c5c6c905adecd8bff069652254c13f84b9b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 27 Feb 2020 14:08:10 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
61148
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame B57A
113 B
178 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.giga.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
modify-fv-return-position.js
cdn.taboola.com/ui-ab-tests/modify-fv-return-position/
2 KB
1 KB
Script
General
Full URL
https://cdn.taboola.com/ui-ab-tests/modify-fv-return-position/modify-fv-return-position.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200304-8-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
c745e8a9de5723ee3842f6a4ec315c5c56f6a29519dc70307c4fda58dcbb0d66

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
WsSK_qpPy5X3N8pMYqWPMI963_KTKmj0
content-encoding
gzip
age
27313
x-cache
HIT
status
200
date
Thu, 05 Mar 2020 06:17:24 GMT
x-amz-replication-status
COMPLETED
content-length
995
x-amz-id-2
HafdSevZQ9IyIquyKii/Ilg4LZDfShkYRez+o3Yh9tmYBfHb65AF2YPqb2ASGnkMFxCis/3dJdE=
x-served-by
cache-hhn4022-HHN
last-modified
Mon, 24 Feb 2020 19:57:07 GMT
server
AmazonS3
x-timer
S1583389045.569629,VS0,VE0
etag
"a817dda7d612fe933422f60170ac620a"
vary
Accept-Encoding
x-amz-request-id
965B981E713DC2B7
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript
abp
84
x-cache-hits
14746
tb
15.taboola.com/
32 KB
33 KB
Script
General
Full URL
https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&encoded=1&uid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&variant=0|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1583389044565&tagid=&cntry=BE&platform=1&sesid=e50b912300de59dc88f69ca85520f641&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1583389043796&geolat=&geoing=&deviceifa=&appid=&sd=v2_e50b912300de59dc88f69ca85520f641_28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4_1583389044_1583389044_CNawjgYQrMVBGNTY3cqKLiABKAEwFjjqxgdA4YYQSN2b1QFQ____________AVgAYABo5YTr_anMs6vkAQ&ri=eb45f7eb7bbbbe84add99742023f559a&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599&oee=true&tpubid=1073836&uis=2
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200304-8-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
eeeadfeed3d3cf8974df0e53ef6a002dcaa84433c501fcc574416d5af9bc645e

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:24 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389045.624109,VS0,VE17
machineid
1417
x-served-by
cache-fra19162-FRA
x-cache
MISS
content-type
text/html;charset=ISO-8859-1
status
200
cache-control
no-cache,must-revalidate,no-store,max-age=0,s-maxage=0
x-cache-hits
0
accept-ranges
bytes
expires
Sat, 26 Jul 1997 05:00:00 GMT
feed-card-placeholder.20200304-8-RELEASE.es6.js
cdn.taboola.com/libtrc/
5 KB
1 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/feed-card-placeholder.20200304-8-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
be0a3204975d1f5503f91bf8596930becdfefec88034e1852d2d075308a6bdb9

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
eFmyKKLqKapqf6gnwpXFlyTH53Y4iOOQ
content-encoding
gzip
age
62
x-cache
HIT
status
200
date
Thu, 05 Mar 2020 06:17:24 GMT
x-amz-replication-status
COMPLETED
content-length
1268
x-amz-id-2
av6VbKCvKo2kfEeGr7BHStmEYLfp5RVdMEU/D3Cv3xJ6rjwvRiz/ebAU1AxRDf3Fy3O+gj+IWzQ=
x-served-by
cache-hhn4022-HHN
last-modified
Wed, 04 Mar 2020 09:25:45 GMT
server
AmazonS3
x-timer
S1583389045.574046,VS0,VE0
etag
"830b800ea225cea32c4d1a5a328470f0"
vary
Accept-Encoding
x-amz-request-id
D83341680D128B16
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
84
x-cache-hits
415
f89e1763-220d-4e09-ba69-9e040548fb7a.svg
cdn.taboola.com/static/f8/
4 KB
2 KB
Image
General
Full URL
https://cdn.taboola.com/static/f8/f89e1763-220d-4e09-ba69-9e040548fb7a.svg
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200304-8-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

x-amz-version-id
cMrDKn.emLmm9kiiOOF64ulDT4DRy6LK
content-encoding
gzip
age
96
x-cache
HIT
status
200
date
Thu, 05 Mar 2020 06:17:24 GMT
x-amz-replication-status
COMPLETED
content-length
1758
x-amz-id-2
l03aK5coDHMxIVw6UZl95levmMG8DMwBQ/PIj7cySTLGvEdRI+h9vWEhWmVryH43NVPNS4ftZQ8=
x-served-by
cache-hhn4022-HHN
access-control-allow-origin
*
last-modified
Wed, 07 Feb 2018 11:15:52 GMT
server
AmazonS3
x-timer
S1583389045.578994,VS0,VE0
etag
"b8b410e4b18d45aa2f3d9bc09cd335fb"
vary
Accept-Encoding
access-control-allow-methods
GET
x-amz-request-id
C1B09E8B7F992D0F
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/svg+xml
access-control-allow-headers
*
abp
84
x-cache-hits
278
userx.20200304-8-RELEASE.es6.js
cdn.taboola.com/libtrc/
22 KB
8 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/userx.20200304-8-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
c7a56f39623c6edcbae8e2cfd8cb738cae33dccb4580b2574607624dbb468043

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
jBJfqvYgR6I4hDzYSc7P24UTasPPRnOg
content-encoding
gzip
age
57
x-cache
HIT
status
200
date
Thu, 05 Mar 2020 06:17:24 GMT
x-amz-replication-status
COMPLETED
content-length
7711
x-amz-id-2
A/3xponbg0SH/UEbkYLWtfcSGF9i6KcxTh2vkUErCX5JH93fImTSMGOGN2AS/kEfWtlC/qYF4ec=
x-served-by
cache-hhn4022-HHN
last-modified
Wed, 04 Mar 2020 09:25:38 GMT
server
AmazonS3
x-timer
S1583389045.586772,VS0,VE0
etag
"14e405b0b49939a3b0b774e4914cb8b2"
vary
Accept-Encoding
x-amz-request-id
BD2F02DD6D5D2EE1
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
84
x-cache-hits
151
rtb-h
trc.taboola.com/sg/exposebox-network/1/ Frame 786F
Redirect Chain
  • https://server.exposebox.com/rcm
  • https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_2go82tcbo7w
0
50 B
Image
General
Full URL
https://trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_2go82tcbo7w
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Thu, 05 Mar 2020 06:17:24 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389045.929147,VS0,VE9
x-served-by
cache-fra19125-FRA
x-cache
MISS
status
204
accept-ranges
bytes
x-cache-hits
0

Redirect headers

date
Thu, 05 Mar 2020 06:17:24 GMT
via
1.1 google
x-powered-by
Express
location
//trc.taboola.com/sg/exposebox-network/1/rtb-h?taboola_hm=_2go82tcbo7w
p3p
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
status
302
cache-control
max-age:0
alt-svc
clear
expires
0
match
match.zorosrv.com/ Frame 786F
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=826423ba-2c35-42b5-b225-309c6aaf7dc8
  • https://match.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=826423ba-2c35-42b5-b225-309c6aaf7dc8&tbid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&query=taboola_hm%3D826423ba-2c35-...
  • https://match.zorosrv.com/match?tabid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&extuid=826423ba-2c35-42b5-b225-309c6aaf7dc8&excid=218&query=taboola_hm%3D826423ba-2c35-42b5-b225-309c6aaf7dc8
0
317 B
Image
General
Full URL
https://match.zorosrv.com/match?tabid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&extuid=826423ba-2c35-42b5-b225-309c6aaf7dc8&excid=218&query=taboola_hm%3D826423ba-2c35-42b5-b225-309c6aaf7dc8
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389045.102000,VS0,VE8
x-cache
MISS
p3p
policyref="/w3c/p3p.xml", CP="NOI IDC DSP COR CURa ADMa OUR IND COM STA NOR UNI"
status
200
x-cache-hits
0
accept-ranges
bytes
access-control-allow-headers
X-Requested-With, X-Prototype-Version, Content-Type, Origin, Allow
content-length
0
x-served-by
cache-fra19162-FRA

Redirect headers

date
Thu, 05 Mar 2020 06:17:25 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389045.070613,VS0,VE8
location
https://match.zorosrv.com/match?tabid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&extuid=826423ba-2c35-42b5-b225-309c6aaf7dc8&excid=218&query=taboola_hm%3D826423ba-2c35-42b5-b225-309c6aaf7dc8
x-cache
MISS
status
302
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4067-HHN
sync.php
pixel.rubiconproject.com/exchange/ Frame 786F
0
239 B
Image
General
Full URL
https://pixel.rubiconproject.com/exchange/sync.php?p=16698
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_GCM
Server
69.173.144.139 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT, US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Cache-Control
no-cache,no-store,must-revalidate
Content-Type
image/gif
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
X-RPHost
66ef90d06496cfd000aab8206f2b6221
Expires
0
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame 786F
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=W4Y2794f3yXpXYxZMk9cFSO1ypu5aHIZh1HLYpQKmNw%3D
45 B
96 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=W4Y2794f3yXpXYxZMk9cFSO1ypu5aHIZh1HLYpQKmNw%3D
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Thu, 05 Mar 2020 06:17:25 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389046.697311,VS0,VE9
x-served-by
cache-fra19125-FRA
x-cache
MISS
status
200
accept-ranges
bytes
x-cache-hits
0

Redirect headers

Location
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=W4Y2794f3yXpXYxZMk9cFSO1ypu5aHIZh1HLYpQKmNw%3D
Date
Thu, 05 Mar 2020 06:17:25 GMT
Server
nginx
Connection
close
Etag
"W4Y2794f3yXpXYxZMk9cFSO1ypu5aHIZh1HLYpQKmNw="
Content-Length
0
/
trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/ Frame 786F
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://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]&mm_bnc&mm_bct&UUID=32ba5e60-997e-4b00-bb9a-e84a0f614c13
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=32ba5e60-997e-4b00-bb9a-e84a0f614c13
0
262 B
Image
General
Full URL
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=32ba5e60-997e-4b00-bb9a-e84a0f614c13
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Thu, 05 Mar 2020 06:17:34 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389055.617680,VS0,VE9
x-served-by
cache-fra19125-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

Date
Thu, 05 Mar 2020 06:17:29 GMT
Server
MT3 2129 8dd2d16 master cdg-pixel-x20
P3P
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
location
https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=32ba5e60-997e-4b00-bb9a-e84a0f614c13
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Keep-Alive
timeout=360
Content-Length
0
Expires
Thu, 05 Mar 2020 06:17:28 GMT
rtset
bh.contextweb.com/bh/ Frame 786F
0
0

/
trc.taboola.com/sg/rtbhouse-network/1/rtb-h/ Frame 786F
Redirect Chain
  • https://creativecdn.com/cm-notify?pi=taboola
  • https://ams.creativecdn.com/cm-notify?pi=taboola&tc=1
  • https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=AKT5bJYtOlH3fBv0Mc0S&pi=taboola&tc=1
0
196 B
Image
General
Full URL
https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=AKT5bJYtOlH3fBv0Mc0S&pi=taboola&tc=1
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Thu, 05 Mar 2020 06:17:32 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389052.023142,VS0,VE9
x-served-by
cache-fra19125-FRA
x-cache
MISS
status
204
accept-ranges
bytes
x-cache-hits
0

Redirect headers

status
302
pragma
no-cache
date
Thu, 05 Mar 2020 06:17:32 GMT, Thu, 05 Mar 2020 06:17:32 GMT
cache-control
no-cache, no-store, must-revalidate, private, max-age=0
content-length
0
location
https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=AKT5bJYtOlH3fBv0Mc0S&pi=taboola&tc=1
expires
Thu, 01 Jan 1970 00:00:00 GMT
getuidnb
ib.adnxs.com/ Frame 786F
43 B
690 B
Image
General
Full URL
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.209 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
314.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:26 GMT
AN-X-Request-Uuid
c900837a-1635-4d6c-9f33-7da160721f31
Content-Type
image/gif
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
82.102.19.134; 82.102.19.134; 314.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.74:80
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
/
trc.taboola.com/sg/google-network/1/rtb-h/ Frame 786F
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=CAESEJaYg1pgQP9lmk-NLfvRnOU&google_cver=1
0
55 B
Image
General
Full URL
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEJaYg1pgQP9lmk-NLfvRnOU&google_cver=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Thu, 05 Mar 2020 06:17:24 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389045.682321,VS0,VE9
x-served-by
cache-fra19125-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:24 GMT
server
HTTP server (unknown)
location
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEJaYg1pgQP9lmk-NLfvRnOU&google_cver=1
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
304
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
getuidnb
ib.adnxs.com/ Frame 786F
43 B
691 B
Image
General
Full URL
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.209 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
314.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:26 GMT
AN-X-Request-Uuid
d9cacd1d-573a-450d-96ba-480ef2a852ef
Content-Type
image/gif
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
82.102.19.134; 82.102.19.134; 314.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.143:80
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
/
trc.taboola.com/sg/thetradedesk-network/1/rtb-h/ Frame 786F
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=c97255c2-431c-4b10-b60f-ade4181269b6
0
207 B
Image
General
Full URL
https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=c97255c2-431c-4b10-b60f-ade4181269b6
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Thu, 05 Mar 2020 06:17:26 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389047.672374,VS0,VE9
x-served-by
cache-fra19125-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:26 GMT
x-aspnet-version
4.0.30319
location
https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=c97255c2-431c-4b10-b60f-ade4181269b6
p3p
CP="NOI DSP COR CUR ADMo DEVo PSAo PSDo OUR SAMo BUS UNI NAV"
status
302
cache-control
private,no-cache, must-revalidate
content-type
text/html
content-length
239
rtb-h
trc.taboola.com/sg/storygize-network/1/ Frame 786F
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
0
59 B
Image
General
Full URL
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-vcl-time-ms
10
date
Thu, 05 Mar 2020 06:17:25 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389046.657997,VS0,VE10
x-served-by
cache-fra19125-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

Location
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=37cf273d-6031-4a9e-b4c2-17b86d952301
Pragma
no-cache
expires
0
cache-control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
P3P
CP ALL ADM DEV PSAi COM OUR OTRo STP IND ONL
cookiesync
bttrack.com/pixel/ Frame 786F
35 B
380 B
Image
General
Full URL
https://bttrack.com/pixel/cookiesync?source=14b8c562-d12b-418b-b680-ad517d5839ec
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_GCM
Server
192.132.33.46 , United States, ASN18568 (BIDTELLECT, US),
Reverse DNS
46.bidtellect.com
Software
Microsoft-IIS/8.5 /
Resource Hash
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

X-ServerName
Track002-dc3
Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:25 GMT
X-AspNetMvc-Version
5.2
Server
Microsoft-IIS/8.5
X-AspNet-Version
4.0.30319
P3P
CP="CAO DSP COR ADMo DEVo PSAo PSDo HISo IVAo IVDo OUR IND OTC"
Cache-Control
private,no-cache
Content-Type
image/gif
Content-Length
35
Expires
-1
/
cds.taboola.com/ Frame 786F
0
176 B
Image
General
Full URL
https://cds.taboola.com/?uid=28564703-bb3d-4b64-a6ed-2434b71267be-tuct55a1ef4&_r=1470450
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
141.226.224.32 , United States, ASN200478 (TABOOLA-AS, IL),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Date
Thu, 05 Mar 2020 06:17:26 GMT
cache-control
no-store
x-envoy-upstream-service-time
0
Server
nginx
Connection
close
Content-Length
0
/
trc.taboola.com/sg/bidswitch-network/1/rtb-h/ Frame 786F
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola
  • https://px.adhigh.net/p/cm/bsw?bidswitch_ssp_id=taboola
  • https://px.adhigh.net/p/cm/bsw?bidswitch_ssp_id=taboola&bounced=1
  • https://x.bidswitch.net/sync?dsp_id=9&user_id=J1K1E3zDYm.AikABlFwqVdyMQ&expires=30&ssp=taboola
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=78f8a296-27f6-4e6e-812e-8247c871369b
0
202 B
Image
General
Full URL
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=78f8a296-27f6-4e6e-812e-8247c871369b
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-vcl-time-ms
9
date
Thu, 05 Mar 2020 06:17:25 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389045.359046,VS0,VE9
x-served-by
cache-fra19125-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

status
302
date
Thu, 05 Mar 2020 06:17:25 GMT
cache-control
no-cache, no-store, must-revalidate
content-length
0
location
//trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=78f8a296-27f6-4e6e-812e-8247c871369b
p3p
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
collect
www.google-analytics.com/
35 B
102 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=2108822051&t=event&ni=1&_s=13&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEAB~&jid=&gjid=&cid=468571453.1583389044&tid=UA-204785-4&_gid=2005420547.1583389044&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Affiliate%20Widget%20Variante&cm73=1&cm13=1&z=1113223306
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 23 Jan 2020 19:32:49 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3581076
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
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
35.156.162.45 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-35-156-162-45.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Thu, 05 Mar 2020 06:17:24 GMT
ads
securepubads.g.doubleclick.net/gampad/ Frame B57A
19 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3831497916287387&correlator=3997275594468860&output=ldjh&impl=fif&eid=21065575&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-728x90&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=728x90&eri=6&cookie=ID%3D2ce47321758371f6%3AT%3D1583389044%3AS%3DALNI_MbBndNf_a5TygxPbyEQbMDiOdtl5w&cdm=www.giga.de&bc=31&abxe=1&lmt=1583389044&dt=1583389044633&dlt=1583389044513&idt=113&ea=0&frm=23&biw=1585&bih=1200&isw=728&ish=90&oid=3&adxs=429&adys=125&adks=4143599050&ucis=s6am9y4whjfd&ifi=1&ifk=215055865&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&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=8&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=468571453.1583389044&ga_sid=1583389045&ga_hid=606509478&fws=256&ohw=0&btvi=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
cafe /
Resource Hash
870acd964c14c5e6e4b24de8d61c926b924d69f88a540430234e8a90783ab4fb
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
7691
x-xss-protection
0
google-lineitem-id
5021208867
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138266090691
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2020022701.js
securepubads.g.doubleclick.net/gpt/ Frame B57A
69 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
sffe /
Resource Hash
8b81c098f8cd1362848b2d9b10a139bbf07ed1aa0411712c7d502d31a1734506
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 27 Feb 2020 14:08:10 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
25762
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame B57A
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

truncated
/ Frame B57A
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
42dceddea84c6aa9734bbcc38522bbcbe3eb3f93eea6ac3fec86ae29323443dd

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
bulk
trc.taboola.com/stroeer-smb-giga/log/3/
0
103 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/bulk?tvi2=2209&route=AM%3AAM%3AV&lti=deflated&bulkSize=4
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200304-8-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
9
date
Thu, 05 Mar 2020 06:17:24 GMT
via
1.1 varnish
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
status
204
x-served-by
cache-fra19125-FRA
pragma
no-cache
server
nginx
x-timer
S1583389045.662560,VS0,VE9
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
648 B
Image
General
Full URL
https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200304-8-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

x-amz-version-id
hL.cyLD7Q4TL5ceY.7JQwF9m5IYI8mkC
via
1.1 varnish
age
24391
x-cache
HIT
status
200
date
Thu, 05 Mar 2020 06:17:24 GMT
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
grODyaFUyHwi27S6u2hd746yPHwUf+y1im5Wn93DxT7wozhn8KMFUP712WAAG3eD1t2rnF4k3Bs=
x-served-by
cache-hhn4022-HHN
last-modified
Wed, 24 Jun 2015 07:14:11 GMT
server
AmazonS3
x-amz-meta-s3cmd-attrs
uid:0/gname:root/uname:root/gid:0/mode:33188/mtime:1377415166/atime:1435052450/md5:dfa7b52c86e56bd67fa4002f6ed19854/ctime:1422381567
x-timer
S1583389045.675839,VS0,VE0
etag
"dfa7b52c86e56bd67fa4002f6ed19854"
x-amz-request-id
29D722C296265892
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
84
x-cache-hits
15489
UnitFeedManagerDesktop.min.js
vidstat.taboola.com/lite-unit/1.0.7/
22 KB
7 KB
Script
General
Full URL
https://vidstat.taboola.com/lite-unit/1.0.7/UnitFeedManagerDesktop.min.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20200304-8-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
553b7035c4df88b88b8903f629f83710ec504f6ed8bb06034be2e68383a149da

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
via
1.1 997f66fda0069dac50a85c7a4fa51b7e.cloudfront.net (CloudFront), 1.1 varnish
age
772189
x-cache
Miss from cloudfront, HIT
status
200
content-encoding
gzip
content-length
7235
x-served-by
cache-hhn4022-HHN
last-modified
Tue, 25 Feb 2020 07:38:06 GMT
server
AmazonS3
x-timer
S1583389045.394958,VS0,VE0
etag
"7df5103f291829252ce9e6c0d4cc60f3"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
x-amz-cf-id
PuWWlY9fstqCO2WNeBO0UVCZxi83KhYxHIdbprjxq83Am6Em3jEpEA==
x-cache-hits
55098
data
lb46.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb46.s400.meetrics.net/data?/K06kDdLAAKktFLkqFFlqwF23A52AwwA/k0FMEmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A0zA2wALlnFBUkzF2BPQGAAAAAAAB8hPAPBAAFAA8hPTA5iAPBAAAAAn8ABA5iAZAAAOA55A55A85B55A58E55A55AFA2zA2xAyBErA5iAPAEAAAAn8AHA5iAPAAAAAAjRBKA5iASksFbFjAAAAAAAAAAAAEAAA8hPAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0fFvmFfwFhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0fFvmFfwFhnFlBFdAAAn8AxYAAAAFAAAA5iAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFh/vOUA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:25 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 05-Mar-20 06:17:24 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 5912
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstR_FS4Cm2UGKJKY7DNQH8zGzJjVcVbDZKsfyx_JRp1OUz-Bxq3myAe4ng4xhkn4MdcRLud77G7SQ8M-PwvKMjtxH1RViOtJQOurLbXU3xjsKlV_5s_pdQTaUVUnpfmj1j0z6pRuIHh77EonqQiIqgd87H8Jp-audZO96KB8DFfvdVczgFsvVyrbXJg54zptskD7aQKZ-LaIlb9ERtfjTSqaQ7_jJtq2w_8x4Xu6MaYGFvp4NvGwm-vymAHB0LU-lmzFpcktlrK90kwBkw75w&sig=Cg0ArKJSzHLurNgzjXimEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

timing-allow-origin
*
date
Thu, 05 Mar 2020 06:17:24 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
www.googletagservices.com/tag/js/ Frame 5912
43 KB
14 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
acde06ad362c121d053a5a93e0a7ab367d62f3f929045dd909bfe64a1c7179b1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"447 / 554 of 1000 / last-modified: 1583259623"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14516
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 5912
73 KB
28 KB
Script
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_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
31eef561438773aa8905d73dfe2e8400eca13620146d6235c6e019a828bd33fe
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1583324508270956"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
28126
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
5302344717
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5302344717
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
52.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5302344717
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
pubads_impl_2020022701.js
securepubads.g.doubleclick.net/gpt/ Frame 5912
164 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js?21065629
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
sffe /
Resource Hash
dfc3f558d7ab9659f6fc3a1c61fa7c5c6c905adecd8bff069652254c13f84b9b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 27 Feb 2020 14:08:10 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
61148
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 5912
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.giga.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
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
35.156.162.45 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-35-156-162-45.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Thu, 05 Mar 2020 06:17:24 GMT
ads
securepubads.g.doubleclick.net/gampad/ Frame 5912
19 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=992126920691706&correlator=3495823016468722&output=ldjh&impl=fif&eid=21065629%2C21064170%2C21064370%2C21065203%2C21065352&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-300x600&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=120x600%7C160x600%7C300x600&eri=6&cookie=ID%3Dda3a31fd9dbf9150%3AT%3D1583389044%3AS%3DALNI_Mas8PCcxpp6gZRubu9-Jq7ve6aW-w&cdm=www.giga.de&bc=31&abxe=1&lmt=1583389044&dt=1583389044784&dlt=1583389044701&idt=72&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=3&adxs=1318&adys=125&adks=2714360146&ucis=q76b2ijh6odk&ifi=1&ifk=1958905618&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&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=8&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x600&msz=300x600&ga_vid=468571453.1583389044&ga_sid=1583389045&ga_hid=1369463517&fws=256&ohw=0&btvi=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js?21065629
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
cafe /
Resource Hash
b09fe67b03c405c2d10656dbdebb20859a59de6a9e5eb803e7c7d578b736c827
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
7729
x-xss-protection
0
google-lineitem-id
5021576057
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138266369269
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2020022701.js
securepubads.g.doubleclick.net/gpt/ Frame 5912
69 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js?21065629
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js?21065629
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
sffe /
Resource Hash
8b81c098f8cd1362848b2d9b10a139bbf07ed1aa0411712c7d502d31a1734506
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 27 Feb 2020 14:08:10 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
25762
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame 5912
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js?21065629
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

truncated
/ Frame 5912
216 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
aca982026b8eab4d724bf9171dce5d2d5ca0f8a40c695fa2e60069ae7a66a12e

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
8275437b-d598-453d-893e-9d7ec31ba65e
t.nativendo.de/cds/tracking/event/
0
179 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/8275437b-d598-453d-893e-9d7ec31ba65e?aid=182yo&t=data%2Finventory&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1583389045
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1188
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:24 GMT
via
1.1 google
last-modified
Thu, 05 Mar 2020 06:17:24 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
8275437b-d598-453d-893e-9d7ec31ba65e
t.nativendo.de/cds/tracking/event/
0
181 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/8275437b-d598-453d-893e-9d7ec31ba65e?aid=2s8hs&t=data%2Finventory&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1583389045
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1188
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:24 GMT
via
1.1 google
last-modified
Thu, 05 Mar 2020 06:17:24 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
data
lb46.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb46.s400.meetrics.net/data?/K06kEmNAA/k0FUImvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A0zA2wAmvFytFh0FjvFklF94Et1EurFuvF3uFtzAx4EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAz1AxwA2wAzmAjpFk9BxzA4zAwzA34Ay5Az4AmzEp6Fl9BzxA4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1zAwzA1xAw2AwzAmhEwkF91AzwAz1AxwA2wAzmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A02A5zALlnFCUkzFYBPLBAAAAAAABMnGAPAAAFAAMnGTl5/APAAAtGA9BABl5/AZBAAOA55A55A85B55A58E55A55AFAy3Aw4A0BErl5/ASksFSFjAAAAAAAAAAAAEAAAMnGAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFFAzxA4zBxBEMAxzA4zAwzA34Ay5Az4AGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA1zAwzA1xAw2AwzAGAihFuuFlyFKA1zAwzA1xAw2AwzAKA1zAwzA1xAw2AwzAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdtGA9BAfAAfAAFAAAl5/AAAAAPA4tB1uFruFv3FutBzxA4zBxBEAAAAAAAAAAAAAAAAQtjF2T2HWA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:25 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 05-Mar-20 06:17:24 GMT
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 73F9
53 B
703 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=1556051330
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.74.159 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Referer
https://videos.giga.de/embed/176875
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:25 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
D3396197F1868AC6
Content-Length
53
x-amz-id-2
M7pi+Da53B1oWHxtgaHUKFzZoSHHDXpJnNsNzkbTczI+QJbRqV7PlHk50809YcnWJBRWGuuxBEU=
Last-Modified
Thu, 05 Mar 2020 04:55:23 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 73F9
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=7446737492
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
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

Request headers

Referer
https://videos.giga.de/embed/176875
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Thu, 05 Mar 2020 06:32:24 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 73F9
754 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=1941503792
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.32 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-101-32.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb

Request headers

Referer
https://videos.giga.de/embed/176875
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:03 GMT
Via
1.1 9c7c26f5beeb09381cea450ea3581b37.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
22
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
754
Last-Modified
Wed, 22 Jan 2020 03:58:13 GMT
Server
AmazonS3
ETag
"b7cafd7f52366c401d1297c997d1b09d"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA50-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
X_q4oCPInjkvrFVOi_YBGiBH6A3v1gzK0F3BDw4BUypFlix8E1qSkw==
Expires
0
view
securepubads.g.doubleclick.net/pcs/ Frame 6944
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstv44J-UIuWVL7nP8O40yVTXVJTjXNcZ8Qzqygkf2S4qJS1Uj809kbJrI7y0R5dNXiNLOmj-DUNfFavDPjvsdae7i5pzEWWOeSHr5h9I4-7a6qOx9Y8u46SGd3Pg1uO55fK1HWW7YgHLxqIvWMOYZYmFgf-mQurLMv1TPe7rid-S1nv1J3ms3B-m83wPoQFNVGTv9PXVn25PRYyy6TrXqntiIEyfvh0wKDZMfsBWki2p0sY2MgB2DE7LQul4fLrNvmgAII7TIdGpPujHyNdfQ&sig=Cg0ArKJSzMUB8zfMT3lYEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

timing-allow-origin
*
date
Thu, 05 Mar 2020 06:17:24 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
www.googletagservices.com/tag/js/ Frame 6944
43 KB
14 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a3979658fb395398dd2d3d9da7608c6c1a36a68dcf330d22a1e6ec4c29a3c1e4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"447 / 484 of 1000 / last-modified: 1583259623"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14516
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 6944
73 KB
28 KB
Script
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_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
31eef561438773aa8905d73dfe2e8400eca13620146d6235c6e019a828bd33fe
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1583324508270956"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
28126
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
5303510597
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5303510597
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
52.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5303510597
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
/
ssl.2.damoh.giga.de/e1d03b22f020f7405dc574d61c273302107da8f1/ Frame 73F9
807 B
2 KB
XHR
General
Full URL
https://ssl.2.damoh.giga.de/e1d03b22f020f7405dc574d61c273302107da8f1/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
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
c894038ee188c223e93dd1d92a606be67b9590fb3e4a6a0dc484bf3ae961c6ed

Request headers

Referer
https://videos.giga.de/embed/176875
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Thu, 05 Mar 2020 06:17:25 GMT
Connection
keep-alive
Content-Length
807
Last-Modified
Tue, 28 Jan 2020 12:41:45 GMT
Server
AmazonS3
Etag
"c375f889c4e625510890b9eadcb0a3f3"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de35-homad-3
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.giga.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
data
lb46.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb46.s400.meetrics.net/data?/K06kFAPAA/k0FWMmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A0zA2wAmvFytFh0FjvFklF94Et1EurFuvF3uFtzAx4EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAz1AxwA2wAzmAjpFk9BxzA4zAwzA34Ay5Az4AmzEp6Fl9BzxA4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1zAwzA1xAw2AwzAmhEwkF91AzwAz1AxwA2wAzmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A02A5zAmvFytFh0FjvFklF94Et1EurFuvF3uFtzAz4EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAyzA00A3xA3mAjpFk9BxzA4zAwzA0xA30Ay1AmzEp6Fl9BzzA4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF91AzwAyzA00A3xA3mAhwFk9B1zAwyAz0A03Ax3AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A04AzwALlnFDUkzFnBPICAAAAAAAB25yAPAAAFAA25yTbosAPAAAmUA9BABbosAZAAAOA55A55A85B55A58E55A55AGAywA41AwyArbosAPYBAAAAuRBKA5iASksFMFjAAAAAAAAAAAAEAAA25yAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFFAzzA4zBxBEMAxzA4zAwzA0xA30Ay1AGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA1zAwyAz0A03Ax3ADAzrF5BFKA1zAwyAz0A03Ax3AKA1zAwyAz0A03Ax3AtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdmUA9BAhAAfAAFAAAbosAAAAAPA4tB1uFruFv3FutBzzA4zBxBEAAAAAAAAAAAAAAAAQtjFjKx+YA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:25 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 05-Mar-20 06:17:24 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame 849C
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-37/html/container.html?n=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
2973
date
Wed, 04 Mar 2020 14:56:47 GMT
expires
Thu, 04 Mar 2021 14:56:47 GMT
last-modified
Thu, 21 Nov 2019 16:01:11 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
55237
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
osd.js
www.googletagservices.com/activeview/js/current/ Frame B57A
73 KB
27 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
88b230f7cc8dcdf4ac2d71c5537f063d2be6b51ecf10df6ba04bb53a0062b9f2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1583324508270956"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
27646
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:25 GMT
sodar
pagead2.googlesyndication.com/getconfig/ Frame B57A
7 KB
5 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020022701&st=env
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
2b538c1122ab6422830bb4050ea1354d05beeafe073a808b0a9ac1a3d458b37e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
private
content-disposition
attachment; filename="f.txt"
content-type
application/json; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5178
x-xss-protection
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
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
35.156.162.45 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-35-156-162-45.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
access-control-allow-origin
*
date
Thu, 05 Mar 2020 06:17:24 GMT
pubads_impl_2020022701.js
securepubads.g.doubleclick.net/gpt/ Frame 6944
164 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js?21065627
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
sffe /
Resource Hash
dfc3f558d7ab9659f6fc3a1c61fa7c5c6c905adecd8bff069652254c13f84b9b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 27 Feb 2020 14:08:10 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
61148
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:24 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 6944
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.giga.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:24 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
sodar2.js
tpc.googlesyndication.com/sodar/ Frame B57A
14 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582746470043195"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5456
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:25 GMT
ads
securepubads.g.doubleclick.net/gampad/ Frame 6944
332 B
336 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4238642583443104&correlator=298183083531982&output=ldjh&impl=fif&eid=21065627%2C21062453&vrg=2020022701&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200305&iu_parts=5286166%2Cgiga.de%2CDFP-Passback-300x250&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=300x250&eri=6&cdm=www.giga.de&bc=31&abxe=1&lmt=1583389045&dt=1583389045003&dlt=1583389044901&idt=85&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=250&oid=3&adxs=968&adys=282&adks=3816689529&ucis=f4gk148ge3im&ifi=1&ifk=2690321143&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&nhd=1&iag=3&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=8&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=1709835242.1583389045&ga_sid=1583389045&ga_hid=104766193&fws=256&ohw=0&btvi=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js?21065627
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
cafe /
Resource Hash
2cc04669e3c40fc1d94503f771236e704d0d01e44da3bd95795f7c140a0a1144
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
150
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2020022701.js
securepubads.g.doubleclick.net/gpt/ Frame 6944
69 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js?21065627
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js?21065627
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.130 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s18-in-f2.1e100.net
Software
sffe /
Resource Hash
8b81c098f8cd1362848b2d9b10a139bbf07ed1aa0411712c7d502d31a1734506
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 27 Feb 2020 14:08:10 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
25762
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:25 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame 6944
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js?21065627
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
empty

Response headers

truncated
/ Frame 6944
211 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
2519693c1aeb9c0476271315b9f0e12464ff8fe89c525f04f4cb5f40b3c9c5e2

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/ Frame C29F
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js?21065629
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-37/html/container.html?n=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
2973
date
Wed, 04 Mar 2020 14:56:47 GMT
expires
Thu, 04 Mar 2021 14:56:47 GMT
last-modified
Thu, 21 Nov 2019 16:01:11 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
55238
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
osd.js
www.googletagservices.com/activeview/js/current/ Frame 5912
73 KB
27 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020022701.js?21065629
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
88b230f7cc8dcdf4ac2d71c5537f063d2be6b51ecf10df6ba04bb53a0062b9f2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1583324508270956"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
27646
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:25 GMT
gen_204
pagead2.googlesyndication.com/pagead/ Frame 5912
0
60 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&pvsid=992126920691706&r=120x600%7C160x600%7C300x600&w=160&h=600
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:25 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
sodar
pagead2.googlesyndication.com/getconfig/ Frame 5912
7 KB
5 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020022701&st=env
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js?21065629
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
9e246664e309610d36fae107ce8d51f81c4cc10c74a233c5b845e55a2eb819f3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
private
content-disposition
attachment; filename="f.txt"
content-type
application/json; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5211
x-xss-protection
0
hic_qos
ssl.1.damoh.giga.de/ Frame 73F9
24 B
409 B
XHR
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,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.9.6 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.6.9.76.144.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Referer
https://videos.giga.de/embed/176875
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Thu, 05 Mar 2020 06:17:25 GMT
Last-Modified
Wed, 24 Jul 2019 10:17:21 GMT
Server
openresty/1.15.8.2
ETag
"5d383031-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame FA1F
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
dba039a16776e5e34b45bb458e5fb1b6778383091e04d0bff93c43f3ed341155

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
text/javascript
sodar2.js
tpc.googlesyndication.com/sodar/ Frame 5912
14 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js?21065629
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582746470043195"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5456
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:25 GMT
st
imprammp.taboola.com/ Frame E2AA
0
0
Document
General
Full URL
https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=987ED447D723941138969859662&cicmp=1657475&cijs=1&dast=V7ydYCFgMUnIS00PDt0AQUnIS00PDt0AUAAAAGBvQHGzncrUik0W7Em2yWo8Vis5sNl7vhbDHbTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3whabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-hpOHz-gofz8DC7xX6f0-7W_N06l9H0eavuJrfm7xb7XZ7TW2m0vMV-n9PuFlz-FrPL7fLLAQAAAOABQKmwH-IHEAAgAgAAAEACAAAAgCKg4t9C4AIAAAAAA6AA60cDgIJDYV0uy8Vl-bns_gAAeAgAAQAYUCABGMBpKgGoyDk4AQAAAAAAAABg-f___48B0CM-kwHIUBq8MegBePABeBACAAC4GDoQxWEFEDsxISpILGIEAAAAIGU2YXg0qRMqiyoAAIJ0K4ArAIAAuNSrt8os3UGJtzAAAACCsQV6WPx-s8Ou8btdBgAAAAAAAABg9n_2jybEZMCdBkT5Tar2CwgAsPYLCADApm4AAG8CcEEXAKsziMlmtJvMDgAAAODu____Xw-kXIOJczHZDAYjl2s58hiHM9ty4zCuVpPBzDZabO_V3IfsKwrkum9EWGa_76CgnJ4es8sgY7lMBrVA1jS5_AbxQcOwnAyC-U3YYrSaTDbL4Wy5mAyGo-FotD-BGw1wgobDwWI3WOwWi-FkMRkNloMFCsRgghMyHG0mq9FutZssh5PRaLaZbJCiVavZaDMYrmaT2W63Gg6Gy9EIKVqzmE0mi9loudsMlpPRYDgZDhFGhqvZaDfYrCUWz8gtmthGa4VtZXJLRpvRxLeYzHYTl1v0-pheq4VjZTNN8aFOF8e-dmGoTh_HvnbiomAA2V4EF-lEc7r8XS7LW_O2uHVOn8MilmhOFulEdtm3XIOJczHZDAYjl2s58hiHM9ty4zCuVpPBzDZa7CvD1Wy0G2zWEotn5BZNbKO1wrYyuSWjzWjiW0xmu4nLLXp9TK_VwrGymfaN1XCzGS4Ho9G-sRpuNsPlYDTad-gM39XnbFTetAqPTmp2No4vmemgcBks3o1qdRx_Jgdp2Wx06pSJY1Fj9Pv9fr_f7_f7_X6D1nMwGxS-a1mq_Bt2N-c2-zoYFbFEcLpIJ6KX8XQRSyRPi3SisphWM9_K4ptYLBaXcbQwmZzL3WgymGxmrtVyYRFLlKaLdKLXvSwOw-HzFzych4fZL3oaDp-_4OE8PMxusd_ntLs1f7fOZTR93qq7ya35u8V-l-f0Vhotb7Hf57S7BZe_xexyuyzqPzbgZK4YTOaK5VyxGa0SAAAAAAAAAMAS5sybAAAAAJwGslgMJovlAkCIse4SfEqFPDqBvxU3fgwxp8vf5bK8NW-LW-f0Ocy8GQ!&excid=22&tst=1&docw=0&cs=false
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
imprammp.taboola.com
:scheme
https
:path
/st?cipid=8045671&ttype=0&cirid=987ED447D723941138969859662&cicmp=1657475&cijs=1&dast=V7ydYCFgMUnIS00PDt0AQUnIS00PDt0AUAAAAGBvQHGzncrUik0W7Em2yWo8Vis5sNl7vhbDHbTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3whabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-hpOHz-gofz8DC7xX6f0-7W_N06l9H0eavuJrfm7xb7XZ7TW2m0vMV-n9PuFlz-FrPL7fLLAQAAAOABQKmwH-IHEAAgAgAAAEACAAAAgCKg4t9C4AIAAAAAA6AA60cDgIJDYV0uy8Vl-bns_gAAeAgAAQAYUCABGMBpKgGoyDk4AQAAAAAAAABg-f___48B0CM-kwHIUBq8MegBePABeBACAAC4GDoQxWEFEDsxISpILGIEAAAAIGU2YXg0qRMqiyoAAIJ0K4ArAIAAuNSrt8os3UGJtzAAAACCsQV6WPx-s8Ou8btdBgAAAAAAAABg9n_2jybEZMCdBkT5Tar2CwgAsPYLCADApm4AAG8CcEEXAKsziMlmtJvMDgAAAODu____Xw-kXIOJczHZDAYjl2s58hiHM9ty4zCuVpPBzDZabO_V3IfsKwrkum9EWGa_76CgnJ4es8sgY7lMBrVA1jS5_AbxQcOwnAyC-U3YYrSaTDbL4Wy5mAyGo-FotD-BGw1wgobDwWI3WOwWi-FkMRkNloMFCsRgghMyHG0mq9FutZssh5PRaLaZbJCiVavZaDMYrmaT2W63Gg6Gy9EIKVqzmE0mi9loudsMlpPRYDgZDhFGhqvZaDfYrCUWz8gtmthGa4VtZXJLRpvRxLeYzHYTl1v0-pheq4VjZTNN8aFOF8e-dmGoTh_HvnbiomAA2V4EF-lEc7r8XS7LW_O2uHVOn8MilmhOFulEdtm3XIOJczHZDAYjl2s58hiHM9ty4zCuVpPBzDZa7CvD1Wy0G2zWEotn5BZNbKO1wrYyuSWjzWjiW0xmu4nLLXp9TK_VwrGymfaN1XCzGS4Ho9G-sRpuNsPlYDTad-gM39XnbFTetAqPTmp2No4vmemgcBks3o1qdRx_Jgdp2Wx06pSJY1Fj9Pv9fr_f7_f7_X6D1nMwGxS-a1mq_Bt2N-c2-zoYFbFEcLpIJ6KX8XQRSyRPi3SisphWM9_K4ptYLBaXcbQwmZzL3WgymGxmrtVyYRFLlKaLdKLXvSwOw-HzFzych4fZL3oaDp-_4OE8PMxusd_ntLs1f7fOZTR93qq7ya35u8V-l-f0Vhotb7Hf57S7BZe_xexyuyzqPzbgZK4YTOaK5VyxGa0SAAAAAAAAAMAS5sybAAAAAJwGslgMJovlAkCIse4SfEqFPDqBvxU3fgwxp8vf5bK8NW-LW-f0Ocy8GQ!&excid=22&tst=1&docw=0&cs=false
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
t_gid=9e1f3fcb-9c06-40ed-945a-826e9d29d4d5-tuct55a1ef5
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx
accept-ranges
bytes
date
Thu, 05 Mar 2020 06:17:25 GMT
via
1.1 varnish
x-served-by
cache-fra19162-FRA
x-cache
MISS
x-cache-hits
0
x-timer
S1583389045.425572,VS0,VE9
content-length
0
/
ssl.2.damoh.giga.de/9b525db8ea1af4d4bf0fb0ae1491cdb100b85e81/ Frame 73F9
109 B
671 B
XHR
General
Full URL
https://ssl.2.damoh.giga.de/9b525db8ea1af4d4bf0fb0ae1491cdb100b85e81/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGJhZXJhZUhpVGhlcmVpbmc9YmFlcmFlSGlUaGVyZWluZ3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnRtKCkse2lkOmF9KX0sNTAwKTtpZihmLnBuKWwuQ2woKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmViKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5SbihsKTtiLlFuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLlluKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkVoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5FaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlFpfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMudm4uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnFoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnRqPWE7YS5wcm90b3R5cGU9e3BvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5xaFtiXSYmKHRoaXMucWhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5wbygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sU2s6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LHZuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLnVuKGIuZGF0YSl9LHVuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmgoYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZmg6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sUWs6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5PbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sT2w6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFlnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxGbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxlaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sJG46ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLiRuKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0semg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LAp6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPXo7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYSh6KSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LHFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCx6PTA7ejxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoeisrKSxnPWIuY2hhckNvZGVBdCh6KyspLHE9Yi5jaGFyQ29kZUF0KHorKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxBbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSx6PSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksej0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtSaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxZaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxybTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx6azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sSWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxrazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlJpKCl8fGIuWWkoKXx8Yi5ybSgpfHxiLlVqKCl8fGIuemsoKXx8Yi5JaigpfHxiLmtrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0sZ206ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEVsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LGhvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LCRnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy51aShhKSsiOiIrdGhpcy51aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdWk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnBuPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSx3bjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LGlvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMud24oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5GbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5ZZyhiKSlyZXR1cm4gdGhpcy5ZZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5lYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuUWsoZixiKTtyZXR1cm4gZn0sZWI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sUW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YucWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxFaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5lYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlFtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LFluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5lYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LHltOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnRqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnNqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EucW49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eua3A9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSGw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5vcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuUW89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmNuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLklsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5scD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLktrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkprPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuQ2k9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5nbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuanA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLk5vPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG89e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5lbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5zanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkptfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHhoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuY20oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy51anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZ2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLmdqfHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuYmo9YX0pKGMpO3ZhciBLPWMuYmp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5PaXx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWmo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuU24oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LExuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxTbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkRoJiZMLm9vKGEpfSwkcDpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sem06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxzcTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlpqfHxwOyhmdW5jdGlvbihjKXtjLmFrPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sYm86ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sVW46ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxacDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx1cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5wbSgpfHx0aGlzLk1rKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApicTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxNazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxkaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LFlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFloOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxlcTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFZwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5ha3x8cjsoZnVuY3Rpb24oYyl7Yy5MaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkZrPSIzIjt0aGlzLmhkPTA7dGhpcy5YbT0zMDt0aGlzLmJjPVtdO3RoaXMubmI9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnhpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy5UbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnhpfHwodGhpcy54aT0hMCxmLmtmKCkpfSxLaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxzbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnNtKCk7CmlmKCF0aGlzLndtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnBpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMubmIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5uYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm5iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm5iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm5iW2VdLmRldGFpbCksYT10aGlzLm5iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LFpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ga30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxUbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxVbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTGl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5OaXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaWp8fG9hOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5NcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmpqfHxwYTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMua2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLkRrfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Eaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm5oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMubmg9ITApO3RoaXMuTmg9ITE7dGhpcy5YZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxYZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk5oPWE7aWYodGhpcy5uaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk5oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApO3RoaXMuVyhiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy5Eanx8c2E7KGZ1bmN0aW9uKGMpe2MuQ2o9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy50ZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkdiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGU9MDtlPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2UrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2VdLnRhZyl7dGhpcy5HYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkdiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkdiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuR2I9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGU9MDtlPApkLmxlbmd0aDtlKyspYS5vbihkW2VdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZV0mJih0aGlzLnJlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZV0mJnRoaXMuS2goKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5YbSYmIXRoaXMueWEoKSYmKHRoaXMuR2I/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTWI7YiYmKGIuTmQoKSxiLnhkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5qZC5sZW5ndGg+PXRoaXMudGUmJnRoaXMuaSgpKX0sVW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5MZT90aGlzLkxlKys6dGhpcy5MZT0xOnRoaXMuS2U/CnRoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLlhnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Danx8dGE7KGZ1bmN0aW9uKGMpe2MuRWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZSYmZSgpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhLnB1c2goYltlXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwplLndifHx0aGlzLksoZSl8fHRoaXMuem0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxYcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYucWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkxtfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy51az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwkZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5YJiZ0aGlzLlgoKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGUpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnVrfHx4YTsoZnVuY3Rpb24oYyl7Yy50az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVGg9Zi5TYigxMCk7dGhpcy53aT0hMDt0aGlzLkNjPXRoaXMudWg9ITE7dGhpcy5ibihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuSmgoKSx0aGlzLmhsKCksdGhpcy55YigpKX0sYm46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuUigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxxcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5HP2EuRy5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkcmJmEuRy5JYT9hLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuRyYmYS5HLklhP3R5cGVvZiBhLkcuSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEucGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkc/YS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5HP3R5cGVvZiBhLkcucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlRoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saGg6ZnVuY3Rpb24oKXtpZighdGhpcy5SYyl7dmFyIGE9dGhpcy5PYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLlJjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlJjfSx4bTpmdW5jdGlvbigpe2lmKCF0aGlzLnRoKXt2YXIgYT10aGlzLk9jKCksYj10aGlzLnZtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudGg9ITApfXJldHVybiB0aGlzLnRofSx2bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmVhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe3RoaXMuRW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5lYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sRW46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaGgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuRGM9ITA7aWYoZi5SKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2YuUigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxXcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZGEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTsKdGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LaCgpfS5iaW5kKHRoaXMpKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmhoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sSmg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMueG0oKSl7dmFyIGI9dGhpcy5PYygpLGU9dGhpcy5QYygpO2ImJmUmJih0aGlzLkNjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2M/dGhpcy53KCk6KHRoaXMuZGEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLk9jKCksYT10aGlzLlBjKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5kYSgpKToodGhpcy5kYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnVoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmgoKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YillPSEwO2V8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZT0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5NPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGV9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZT1hLmdldEVycm9yKCk7aWYoZS5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEVycm9yQ29kZSYmCmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5JY3x8KHRoaXMuSWM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkljIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSWM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSWMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5JYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZnE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/KHRoaXMudygpLHRoaXMuamEoKSk6dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55YSgpfHwoYXx8KHRoaXMud2k9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5DKHRoaXMud2ksZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHJsOmZ1bmN0aW9uKCl7dGhpcy5ncXx8KDEwPHRoaXMuV28/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZGEuYmluZCh0aGlzKSwKNTAwKSk6KHRoaXMuV28rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5LbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxLbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Ybyl7dGhpcy5Ybz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksCjUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB5YT1jLnRrfHx5YTsoZnVuY3Rpb24oYyl7Yy52az1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5oaSh3aW5kb3cpOwpmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmhpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGhpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxiLnB1c2goYSkpO2lmKDA8Zi5TZShiKSl7Zm9yKHZhciBlIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShlKSYmKGE9bmV3IHhhKGJbZV0pLGEuaGF8fHRoaXMuSyhhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgeWEoYSx0aGlzLkYpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sTzpmdW5jdGlvbigpe3RoaXMuWmI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMudmt8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Xaj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLnRmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5VKCk7CnJldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0scm46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fGIuTmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLnRmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sCnVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LE1hOmZ1bmN0aW9uKCl7fSwkZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuV2p8fFI7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLk9iKyssMTU8dGhpcy5PYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCEwKTtlbHNle3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHZlcnRpc2luZylpZihhPWEuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLk9lPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGU9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT1ifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9CiEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLkJhKCk7CnZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuS2w/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSx0aGlzLktsPSEwLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGIpe2Eucm4oYil9LmJpbmQodGhpcykpKTphLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Wanx8Q2E7KGZ1bmN0aW9uKGMpe2MuWGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5WYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBlPW5ldyBSKGFbYl0pO2UuaGF8fHRoaXMuSyhlKXx8KHRoaXMuTChlKSwobmV3IENhKGUsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBEYT1jLlhqfHxEYSxFYT1uZXcgRGEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Yaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuWGt8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmVoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMudG49YS5wb3NpdGlvbmluZzt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLndpZHRoPWEud2lkdGg7ZS5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2Uuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtlLnN0eWxlLmhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtlLnN0eWxlLm1heEhlaWdodD0KYS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy50bil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTt0aGlzLkNkPWV9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5DZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQ2QpfSxsYTpmdW5jdGlvbigpe3JldHVybiEwfSxxbDpmdW5jdGlvbigpe2YuemgodGhpcy5DZCk7Zi5hZih0aGlzLkNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWwoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sCmdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5Banx8R2E7KGZ1bmN0aW9uKGMpe2Muemo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMuemp8fElhOyhmdW5jdGlvbihjKXtjLkJqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9bS5pbnJlYWQsYj1mLmVoKGEsImVsZW1lbnRJRCIpO2lmKGYuemgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5LKGEpKSl7dGhpcy5MKGEpOyhuZXcgSWEoYSx0aGlzLkYpKS5mKCk7cmV0dXJufXRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuWmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBKYT1jLkJqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5Wa3x8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnZqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sTms6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEM9Yy52anx8QzsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGEsZCwKZyxjKXt0aGlzLkZhPWI7dGhpcy5aZz10aGlzLkZpPSExO3RoaXMuTGg9ZDt0aGlzLmlpPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmtiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09aC5yZWFkeVN0YXRlJiYwPT1oLnN0YXR1cyYmbCYmbC5kZih0aGlzLkZhLnVybCkmJiFjJiYoY29uc29sZS5sb2coInRlc3QxIiksZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCkpO2cmJjQhPWgucmVhZHlTdGF0ZSYmZyhoKX0uYmluZCh0aGlzKX1jLndqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhLmRhdGE7aWYoInN0cmluZyIhPQp0eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy5aZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5rYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuaWk/dGhpcy5rYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmtiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuRml8fCh0aGlzLmtiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5rYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5rYi5zZW5kKGIpfWNhdGNoKGcpe2I9dGhpcy5GYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8CnRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTGgmJnRoaXMuTGgoKX1yZXR1cm4gdGhpcy5rYn19fSkoYyk7dmFyIE1hPWMud2p8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuY2o9YTthLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYil7dGhpcy5tZT1ifSxXbjpmdW5jdGlvbihiKXt0aGlzLkdhPWJ9LEluOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e3ZwOiJBZENsaWNrVGhydSIseHA6IkFkRXJyb3IiLHlwOiJBZFN0b3BwZWQiLEJwOiJBZExpbmVhckNoYW5nZSIsQ3A6IkFkVGFnUGFyc2VkIixGcDoiQWRWaWRlb0NvbXBsZXRlIixJcDoiQWRMb2FkZWQiLApKcDoiQWRTa2lwcGVkIixLcDoiQWRTdGFydGVkIix6cDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLEFwOiJBZEltcHJlc3Npb24iLHdwOiJBZENyZWF0aXZlVmlldyIsRHA6IkFkVmlkZW9NaWRwb2ludCIsRXA6IkFkUGF1c2VkIixHcDoiQWRWaWRlb1N0YXJ0IixIcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLm1lLGFbZF0pfSxIbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuR2EmJnRoaXMuR2EubGUpZm9yKHZhciBhIGluIHRoaXMuR2EubGUpdGhpcy5HYS5sZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkdhLHRoaXMuR2EubGVbYV0pO3RoaXMuR2EmJnRoaXMuR2EuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuR2EuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwKMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5JbigpO3RoaXMuR2EmJnRoaXMuSG4oKX19fSkoYyk7dmFyIE5hPWMuY2p8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnBiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLm9iPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjt0aGlzLmVmPSExO3RoaXMucWE9dGhpcy5RYz0iIjt0aGlzLiRlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnlmPSExO3RoaXMuaWE9W107dGhpcy5XZT10aGlzLlZiPSIiO3RoaXMuamU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5pZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMubGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuYWM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2I9IiI7dGhpcy5YYj0KW107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmliPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmFiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLkhkPTA7dGhpcy5waD0hMTt0aGlzLm9oPTFFMzt0aGlzLkVjPSExO3RoaXMuUGE9MUUzO3RoaXMua2Q9dGhpcy5sZD0iIjt0aGlzLkRiPW51bGw7dGhpcy5HaT0hMTt0aGlzLlljPXRoaXMuUWQ9bnVsbH1jLnhqPWE7YS5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkNhLGFkdGFncGFyYW1ldGVyOnRoaXMucGIsYWR0YWdtb2RpZmllcjp0aGlzLm9iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5lYyxhZHRhZ3JlZ2V4OnRoaXMucWQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuZmYsCnNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLHNlcnZlcjp0aGlzLmlhLHN2bUNvbmZpZzp0aGlzLlZiLGhvbWFkQWRwYXRoOnRoaXMuV2UsSE9NQURfVkVSSUZJRUQ6dGhpcy5qZSxIT01BRF9CTE9DS0VEOnRoaXMuaWUsSE9NQURfTk9CTE9DS0VSOnRoaXMubGIsSE9NQURfQURCTE9DS0VSOnRoaXMuYWMsdGVzdEhpZGU6dGhpcy5XYix0ZXN0VGFnczp0aGlzLlhiLHRlc3RUYWdzSlM6dGhpcy5ZYix0ZXN0VGFnc1hIUjp0aGlzLmJkLHRlc3QzUENvb2tpZTp0aGlzLnRjLHRocm90dGxlOnRoaXMuWmQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5uYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmFiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5iYix2cGFpZDp0aGlzLmliLHNraXBBbGxvd2VkOnRoaXMuTGYsdm1hcHM6dGhpcy5hZyxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuRWMsYWRGYWxsYmFja1VSTDp0aGlzLmxkLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rZCx5aWVsZGxhYjp0aGlzLkRifX0sUG46ZnVuY3Rpb24oYil7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMucGI9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYKKHRoaXMub2I9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuZmY9Yi5qc3BvcHVwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaWRlbG9hZHMmJih0aGlzLnpiPWIuc2lkZWxvYWRzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmRpc2FibGV0ZXN0cyYmKHRoaXMuVGc9Yi5kaXNhYmxldGVzdHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRBbGlhcyYmKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmVmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLlFjPWIuZ2xvYmFsQ29uZmlnKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzQmxvY2tlZCYmKHRoaXMuJGU9Yi5pc0Jsb2NrZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVyJiYodGhpcy5pYT1iLnNlcnZlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zdm1Db25maWcmJih0aGlzLlZiPWIuc3ZtQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5XZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5qZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJgoodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5sYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYodGhpcy5XYj1iLnRlc3RIaWRlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzJiYodGhpcy5YYj1iLnRlc3RUYWdzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzSlMmJih0aGlzLlliPWIudGVzdFRhZ3NKUyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc1hIUiYmKHRoaXMuYmQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnRjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5aZD1iLnRocm90dGxlKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuSGc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEJsb2NrZXJEZXRlY3RlZCYmKHRoaXMueGM9Yi5hZEJsb2NrZXJEZXRlY3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ibG9ja2VkV2FzQ2FsbGVkJiYodGhpcy5zZD1iLmJsb2NrZWRXYXNDYWxsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5XZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLmJlPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYWI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmKHRoaXMuYmI9Yi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZwYWlkJiYodGhpcy5pYj1iLnZwYWlkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNraXBBbGxvd2VkJiYodGhpcy5MZj1iLnNraXBBbGxvd2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy5hZz1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkVjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LG9tOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLmFiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYWJbYV0mJjE9PXRoaXMuYWJbYV0mJihiPSEwKTtyZXR1cm4gYn0sRWY6ZnVuY3Rpb24oYil7dGhpcy5hYltiXT0hMH0sWWw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuYWIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5hYlthXSYmMT09dGhpcy5hYlthXSYmYi5wdXNoKGEpO3JldHVybiBifSxYZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9Zi4kayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBnPSIiLGM9IiIsZj0iIixoPSIiO2lmKCF0aGlzLkNhJiYhYSlyZXR1cm4gbmV3IEMoYik7Zz10aGlzLmNmKGIpO2M9dGhpcy5hYShiKTtnPyh0aGlzLlNjKCk/Zj1iOmY9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZj10aGlzLnFjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMucGJ8fHRoaXMub2J8fAp0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5abShoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLiRsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnFiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sY2Y6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlNjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LGRmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuY2YoYik7cmV0dXJuIGF9LCRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLlJwOwpyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxIaDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGcpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxZbTpmdW5jdGlvbihiLGEpe3ZhciBkPWYuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPApoLmxlbmd0aDtCKyspe3ZhciBrPWhbQl0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5IaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPXRoaXMuSGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Z31sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBnPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxabTpmdW5jdGlvbihiKXt0aGlzLnBiJiYoYis9dGhpcy5wYik7aWYodGhpcy5vYilmb3IodmFyIGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm9iW2FdKSk7aWYoZi5KYylmb3IodmFyIGQ9MDtkPGYuSmMubGVuZ3RoO2QrKyl7dmFyIGc9CmYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuWW0oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmYS5YbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuV24oYi5wbGF5ZXIpO2EuZigpfX0sZzpmdW5jdGlvbihiLGEsZCxnLGMsZil7bD10aGlzO3RoaXMuZWY9ITA7dGhpcy5RYz1iO3RoaXMucWE9YTt0aGlzLnlmPWQ7dGhpcy5lZT1nO3RoaXMuaWM9Yzt0aGlzLnhhPWZ8fHt9O3RoaXMucGwoKTt0aGlzLlBtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnFhKXRoaXMuTm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuR2MoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LENsOmZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQ9ITE7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxQbTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5RYyt0aGlzLnhlKCJnbG9iYWwiKSksdGhpcy5tbS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkdjKCl9LmJpbmQodGhpcyksITApfSxObTpmdW5jdGlvbigpe3RoaXMuS2EobmV3IEModGhpcy5xYSt0aGlzLnhlKCJjbGllbnQiLAotMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iK3RoaXMuU2IoKSk7dGhpcy54YSYmdGhpcy54YS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YiYmKGQ9IiIpO3RoaXMueGEmJnRoaXMueGEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxzYTpmdW5jdGlvbihiKXtpZighdGhpcy5zZCl7dGhpcy5zZD0hMDt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxhPTA7YTxiLmxlbmd0aDthKyspe2lmKGJbYV0mJmJbYV0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2FdLnBhdXNlKXRyeXtiW2FdLnBhdXNlKCl9Y2F0Y2goZSl7fWJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKX1iPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdJiZiW2FdLnBhcmVudE5vZGUmJmJbYV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2FdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYj13aW5kb3cuZG9jdW1lbnQ7Yi5oYXNDaGlsZE5vZGVzKCk7KWIucmVtb3ZlQ2hpbGQoYi5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5pYz0KITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuJGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuaWUpKTt0aGlzLkJiKCk7Zi5MYyhrLnFuKTsoYT1mLlVhKHRoaXMuSWQoKSkpfHwoYT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxtbTpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn12YXIgZz0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmCihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihhLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnFhfHx0aGlzLlZifHx0aGlzLkFhfHx0aGlzLkdjKCk6KHRoaXMuQ2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5CYigpKX19LEdjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7ZD10aGlzLnFhfWVsc2UgZD10aGlzLnFhO2E9ITE7CnRyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGQuc2VydmVyLmxlbmd0aDthKyspe3ZhciBiPWQuc2VydmVyW2FdO3RyeXt2YXIgZTsoZT12b2lkIDA9PT1iKXx8KGU9IWIucmVwbGFjZSgiW2hhc2hdIix0aGlzLkpmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpKS5tYXRjaChSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSkpO2lmKGUpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoYXx8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYygpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9CihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChmLlIoIndlYi5kZSIpfHxmLlIoImdteC5uZXQiKXx8Zi5SKCJnbXguYXQiKXx8Zi5SKCJnbXguY2giKXx8Zi5SKCIxdW5kMS5kZSIpKSYmIXRoaXMuU2MoKSlmb3IoYj0wO2I8dGhpcy5pYS5sZW5ndGg7YisrKXRoaXMuaWFbYl09dGhpcy5pYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmNpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8CiExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJnRoaXMuQWEmJnRoaXMuaWEubGVuZ3RoP3RoaXMuVGMoITEpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5sYikpLHRoaXMuQmIoKSl9LGNpOmZ1bmN0aW9uKGEpe3RoaXMubGR8fCh0aGlzLmxkPWF8fCIiKX0sVGM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUyl7dmFyIGU9e307aWYoYSl7dmFyIGU9bmV3IEModGhpcy5xYygpKSxkPXRoaXMuYWEodGhpcy5WYik7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtlLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwKIiIpO2UubWV0aG9kPSJQT1NUIn1lbHNlIGU9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGUsdGhpcy5yby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTthP3RoaXMuams/dGhpcy5zYSgibm9TVk1Db25maWciKToodGhpcy5qaz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuVGMoITApfS5iaW5kKHRoaXMpLCEwKX19LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlMpe3ZhciBlPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtpZighdGhpcy5uYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMubmM9ITA7dGhpcy5UYyghMCk7cmV0dXJufX1lPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoZT0hMCl9Y2F0Y2goaCl7fWlmKCEoZXx8CmQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2EucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChCKXt9dGhpcy5XZj10aGlzLkFiKGQuc3RyaWN0KTt0aGlzLmJlPXRoaXMuQWIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuU2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmJiPXRoaXMuQWIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkFiKGQuZW5hYmxlZCk7dGhpcy5XYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlliPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuYmQ9ZC50ZXN0YWR0YWdzeGhyfHwKW107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5wYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLm9iPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5xZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5mZj1kLmpzcG9wdXBzfHwhMTt0aGlzLnpiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLmliPWQudnBhaWR8fCExO3RoaXMueGEudnBhaWQ9dGhpcy5pYjt0aGlzLkxmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMudGQ9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmFnPWQudm1hcHN8fCIiO3RoaXMuRWM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlBhPWQuYml0cmF0ZXx8MUUzO3RoaXMuY2koZC5hZF9mYWxsYmFja19VUkx8fCIiKTt0aGlzLmtkPWQuYWRfZmFsbGJhY2tfY29uZmlnfHwhMTt0aGlzLlpkPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307dGhpcy5EYj0KZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuQ28oKSYmKHRoaXMuV2J8fHRoaXMuWWJ8fHRoaXMuWGJ8fHRoaXMuYmQpP3RoaXMueWY/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSksdGhpcy5FZSgpLHRoaXMuQmIoKSk6dGhpcy51bygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlRmKCkpfX0sVG06ZnVuY3Rpb24oYSl7dGhpcy5HaT0hMDt2YXIgZT1mdW5jdGlvbihhKXtpZihhPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnwgKSIrYSsiPShbXjtdKykiKSkpcmV0dXJuIGFbMl19KCJhZHBfc2VncyIpfHwiZTAiLGU9dGhpcy5EYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsCmVuY29kZVVSSUNvbXBvbmVudChlKSksZT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6ZSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLnFiKGUpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07Zi5LZCh0aGlzLnFjKCksIlBPU1QiLGUsZnVuY3Rpb24oZSl7dHJ5e3ZhciBnPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe31mLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwhKCFnfHwhZy5sZW5ndGgpLCEwKTt0cnl7aWYoZyYmZy5sZW5ndGgmJnRoaXMuRGIucGFyYW1ldGVyKXt2YXIgaD10aGlzLkRiLnBhcmFtZXRlci5zcGxpdCgiW2lkXSIpLmpvaW4oZ1swXS5pZHx8IjAiKSxoPWguc3BsaXQoIltwcmljZV0iKS5qb2luKGdbMF0ucHJpY2V8fDApO3RoaXMucGIrPWh9fWNhdGNoKEIpe2EoKX1hKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthKCl9LmJpbmQodGhpcyksITApfSx1bzpmdW5jdGlvbigpe3RoaXMudG8oKTt0aGlzLnZvKCl9LAp2bzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGU9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cud2lkdGg9MTtnLmhlaWdodD0xO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1mLlYoMTApLGg9Zi5WKDEwKSxCPWYuVigxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJkYXRhIiwiIil9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2U9ZS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7ZT1lLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShCKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZi5xYihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGcpfWNhdGNoKGEpe31pZigzIT0KZCl7dmFyIGI9Zi5CZCgpO2lmKChiLmlzQ2hyb21lfHxiLmlzRmlyZWZveCkmJiFiLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsZSwhMCk7cmV0dXJufXRoaXMuc2EoImNzcF8iK2UpfWYudHJhY2soInN0YXRzX2hkX2NzcCIsZSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFRmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpfSxZZDpmdW5jdGlvbihhKXt0aGlzLnhjPSEwO3RoaXMuU3x8KHRoaXMuUz10aGlzLkNhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYihhKSksdGhpcy5CYigpLHRoaXMuRWUoKSl9LHRvOmZ1bmN0aW9uKCl7aWYodGhpcy5XYil7dmFyIGE9Zi5CZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuQ20oKSl0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTtlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZD0wPT09ZS5vZmZzZXRXaWR0aHx8MD09PWUub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSk7YT1kfWNhdGNoKGcpe31hP3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMubGkoKX19ZWxzZSB0aGlzLmxpKCl9LFJmOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtnPQpkLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy55byhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlhiPXRoaXMuYmQpJiZ0aGlzLlhiLmxlbmd0aCl7dmFyIGQ9dGhpcy5YYi5zbGljZSgpLGc9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlFmKCl9LHlvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7YygpJiZlKCl9ZnVuY3Rpb24gYygpe3JldHVybiBmPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGYpLCEwKTohMX12YXIgZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0aGlzLkthKG5ldyBDKGEpLGcsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxsaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz0KZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuem8oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWWImJnRoaXMuWWIubGVuZ3RoKXt2YXIgZD10aGlzLlliLnNsaWNlKCksZzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuUmYoKX0sem86ZnVuY3Rpb24oYSxlLGQpe2Z1bmN0aW9uIGcoKXtmKCkmJmUoKX1mdW5jdGlvbiBjKCl7ZigpJiZkKCl9ZnVuY3Rpb24gZigpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLCEwKTohMX12YXIgaD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2coKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oZSxkKXtkPT1hJiZmKCkmJgpjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtnKCl9fSxRZjpmdW5jdGlvbigpe2lmKHRoaXMudGMpdHJ5e2YuS2QodGhpcy50YywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5IYj0hdGhpcy5BYihhLmNjKTt0aGlzLlRmKCl9LmJpbmQodGhpcyksdGhpcy5qaS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmppKCl9ZWxzZSB0aGlzLlRmKCl9LGppOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5mYih0aGlzLmxiKSk7dGhpcy5CYigpO3RoaXMuRWUoKX0sQ206ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3siZW5hYmxlZCI6dHJ1ZSwgImZvcmNlX2Rpc2FibGVkIjp0cnVlfScpLmhhc093blByb3BlcnR5KCJlbmFibGVkIil9Y2F0Y2goYSl7cmV0dXJuImZhaWwifX0sCkJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMueGMmJihlPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2UsITApO3RoaXMuQ2EmJnRoaXMuaXNFbmFibGVkJiZ0aGlzLlFkJiZ0aGlzLmNsKCk7dGhpcy50YyYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkhiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy5qZSkpO3RoaXMuZWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZSYmdGhpcy5lZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5IYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuWWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ZYy5pZD1mLlYoMTApO3RoaXMuWWMuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLlljKTt2YXIgYT10aGlzLlljLmNvbnRlbnRXaW5kb3csZT0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD1mdW5jdGlvbigpe2Zvcih2YXIgZSxnPTA7Zzx0aGlzLlFkLmxlbmd0aDtnKyspZT1hLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz10aGlzLlFkW2ddLGEuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX0uYmluZCh0aGlzKTtlLnNyYz1mLkFlKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZi50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sb2w6ZnVuY3Rpb24oKXtpZih0aGlzLmJlJiZ0aGlzLm9tKCkpe3ZhciBhPQp0aGlzLllsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxwaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZSl7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZSxkLGcsYyxoKXt0aGlzLkhkfHwodGhpcy5IZD0wKTt0aGlzLkhkKys7dGhpcy5IZD50aGlzLm9oJiYhdGhpcy5waCYmKHRoaXMucGg9ITAsZi50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLm9oLCEwKSk7YT1uZXcgTWEoYSxlLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpO2cmJihhLkZpPSEwKTtjJiZmLkFtKCkmJihhLlpnPSEwKTtoJiYKKGEuaWk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLldtfHwodGhpcy5XbT0hMCxmLkRhKCl8fGYuZWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhlPWEucmVzcG9uc2VYTUwpfHwoZT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJmcuY2hpbGROb2Rlc1swXT9nLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGUpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoZSk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsCmcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LHNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmFnfSxtbDpmdW5jdGlvbigpe3RoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuS2EoYSx0aGlzLlBvLmJpbmQodGhpcyksdGhpcy5Pby5iaW5kKHRoaXMpKX0sClBvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5KbCgpfSxPbzpmdW5jdGlvbigpe30sSmw6ZnVuY3Rpb24oKXtmLkxjKGsuSWwpO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09ZS50eXBlJiZmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09ZS50eXBlKXt2YXIgZD1uZXcgSTt3aW5kb3dbZC5nYSgpXT0KdGhpcztmLmViKGUudXJsLGUuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LENvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWmR9LFNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGU9IiIsZD0wO2Q8YTtkKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGV9LEFiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHFiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0iIixkLGcsYyxmLGgsayxsPTA7bDxhLmxlbmd0aDspZD0KYS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGY9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZT1lKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBlfSxhYTpmdW5jdGlvbihhKXt2YXIgZT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtlW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixlKXtiJiYoZC5xdWVyeUtleVtiXT1lKX0pO3JldHVybiBkfSxKZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSIiLGUsZDtmb3IoZT03OzA8PWU7ZS0tKWQ9YT4+PjQqZSYxNSxiKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGcsYyxmPUFycmF5KDgwKSwKaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scCxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChnKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWZbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKylmW2ddPWQoZltnLTNdXmZbZy04XV5mW2ctMTRdXmZbZy0xNl0sMSk7Yz1oO249aztwPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZwfH5uJnIpK3UrZltnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnB8biZyfHAmcikrdStmW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTYwOzc5Pj1nO2crKyl2PWQoYyw1KSsobl5wXnIpK3UrZltnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLApjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihlKGgpK2UoaykrZShsKStlKG0pK2UodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnhqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLlVrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSxkKXt0aGlzLmE9YTthLmMuUD90aGlzLmdiPWEuYy5QKCk6dGhpcy5nYj0iIjthLmMud2gmJmEuYy53aCh7cGF1c2U6dGhpcy5OZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLiRoLmJpbmQodGhpcyksbXV0ZTp0aGlzLm9mLmJpbmQodGhpcyksCnVubXV0ZTp0aGlzLkpvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEuc2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5qYz10aGlzLnJkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9ZTt0aGlzLmpiPXt9O3RoaXMudmlkZW89e307dGhpcy5WZD17fTtmLnZiKCJuZXdCaWdBZElkIik7dGhpcy5ibD1mLlYoMTApO3RoaXMuTmY9MDt0aGlzLm9kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMub2Q9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMub2Q9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuVGs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5XYz10aGlzLlVkPSExO3RoaXMuRmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/CnBhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy53ZT0hMTt0aGlzLnRpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMub2M9ITE7dGhpcy56bD1mLlYoMTApO3RoaXMuUmI9Zi5WKDEwKTt0aGlzLlBiPWYuVigxMCk7dGhpcy5laT1mLlYoMTApO3RoaXMuY29uZj17fTt0aGlzLmZlPXRoaXMuJGI9dGhpcy5JZT10aGlzLnlkPXRoaXMuV2Q9dGhpcy5DYj10aGlzLnZjPXRoaXMuT2g9dGhpcy5IZT10aGlzLkRkPXRoaXMuRG89dGhpcy5GYj10aGlzLlFiPSExO3RoaXMuQWM9W107dGhpcy5wYz17fTt0aGlzLm1uPTIwMDt0aGlzLmRnPXRoaXMuZGQ9dGhpcy5GYz10aGlzLmNnPXRoaXMueGY9ITE7dGhpcy5xZj17fX1jLnJqPWE7YS5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihlPQp0aGlzLmNvbmZbdGhpcy5nYl1bYV0pO3JldHVybiBlfSxyaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5OYiYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMua28oKTtmLm8oay5Layx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxqZjpmdW5jdGlvbihhLGUsZCxnKXt0aGlzLkZiPWQ7dmFyIGM9ITE7ZyYmZy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGM9ITApO2lmKHRoaXMuQS5TKXRoaXMuTmYrKyxmLnZiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxnPWwuZ2V0Q29uZmlnKCksZi5PZyYmKHRoaXMuQS5Qbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZi50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5BLkNhJiZ0aGlzLkEuaXNFbmFibGVkPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCwKa2VlcFVSTDplLGJpdHJhdGU6Zy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5pYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpjLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTplPyh0aGlzLnJpKCksbmV3IFModGhpcyxhLHRoaXMuRmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaWIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpnLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Yyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5RYSgpO2Vsc2V7dmFyIGg9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmNvKHRoaXMuYik7dGhpcy5raChhKTt0aGlzLkFjPXRoaXMuYWgoYSk7dGhpcy5zbCgpfSxraDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmltKGIpKSx0aGlzLmtoKGIucGFyZW50KSl9LGFoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5haChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlRsKGIpKSk7cmV0dXJuIGV9LFRsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLmtwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmNuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5IbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMubG8oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Rbyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsubHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5vcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLk1vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLk5vLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sY286ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuamIuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS5ycT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlRrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk9rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5taShlKSl7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5SayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmpiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMuamIuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuYW8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sYW86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuU2sodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5maSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5QaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmpiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5qYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMueWkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLmxtKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuWW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5abygpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuQ2ksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5jcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMuaHAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZnAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZ3AoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5pcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5lcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5EaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGUpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiRvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmFwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LCRvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0sYXA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sYnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LFpvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuZ2koKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxocDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmcDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxncDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxpcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LERpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LFlvOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsuanAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkRpKCEwKX0sT2s6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBlPWIuYWEoYSk7cmV0dXJuIGUucHJvdG9jb2wrIjovLyIrZS5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLlVvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbWk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFJrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5CaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQWk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm1pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlNvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLlJvKCk7dGhpcy55aSgpO3RoaXMuQmcoKTt0aGlzLmEuUGgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5kaSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuYmImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LExrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZmgoYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5pbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuTGsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5nbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuamIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS52aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlloKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkloKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sVW86ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQmk6ZnVuY3Rpb24oKXtpZih0aGlzLkRvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5HbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5DaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmpiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLnZpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi4kZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxzaTpmdW5jdGlvbigpe3RoaXMuT2h8fCh0aGlzLk9oPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxHbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudGl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuc2koKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnNpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuZ2koKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5iYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuYmImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmJiJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy50aT1hKX0sZmk6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxrbzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sZ2k6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LGxvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5iYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5iYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLnltKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkprLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGUpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkRsKHRoaXMuYi5PYSxhKX1jYXRjaChCKXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5OayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLlBrKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5YaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlhoKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxQazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFhoOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sbm86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sam06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxEbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxTbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy56aS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLnppLmJpbmQodGhpcykpfSx6aTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sUm86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuJGcoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx5aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm5pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubmkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuRm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Fby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5laTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LG9pOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSwkaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LEVvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sRm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxKbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuSG0oKSYmdGhpcy5HbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLkhvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LEhtOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuaWJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5pYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5pYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxHbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sWmw6ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LEhvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmlmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7fXRoaXMueGQoKX12YXIgZT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMsZD10aGlzLlpsKCk7dGhpcy5GYz10aGlzLldjPXRoaXMuZGQ9dGhpcy5kZz0hMDtyZXR1cm4gZT8oZi5lYigiaHR0cHM6Ly93d3cud2VsZWN0LmRlL2FwaS92MS9wcmVmbGlnaHQvYnlfYWxpYXMvIitlLCJkZXdlbGVjdHd3d3dlbGVjdGRlIix7fSxhLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpLHRoaXMuQSksITApOiExfSxMZzpmdW5jdGlvbihhKXt0aGlzLm5vKCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZyghMCl9LmJpbmQodGhpcyksCnRoaXMubW4pOih0aGlzLldkPSEwLHRoaXMuYS5WZSgpLHRoaXMuYS5NbigpLHRoaXMub2M9ITEsYT10aGlzLmIuc3x8e30sdGhpcy5IZXx8KGEubm9Db21wbGV0ZVF1YXJ0aWxlPSEwKSxmLm8oay55bCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMuUmUoKS5ZaCgpKX0sUmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYSYmdGhpcy5hLmMmJihhPXRoaXMuYS5jKTtyZXR1cm4gYX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZi5hZih0aGlzLnZpZGVvLGEpP3RoaXMuJGgoKTp0aGlzLk5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIucmIsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIuRWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmCihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuQWMmJjA8dGhpcy5BYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuQWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sdTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuYmwrIi0iK3RoaXMuTmY7dGhpcy5iJiZ0aGlzLmIuZ2gmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5iLmdoKCkpO3JldHVybiBhfSxSZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMucmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5xcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJhPWMucXB8fFJhO25ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGIsZCxjKXt0aGlzLm9wdGlvbnM9Y3x8e307ZT1kO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLm9hPW51bGw7dGhpcy5ZPVtdO3RoaXMuSj1udWxsO3RoaXMuemM9dGhpcy5CYz0hMTt0aGlzLmJhPSIiO3RoaXMuYmc9ITE7dGhpcy5yaD0iIjtjJiZjLmVtcHR5P3RoaXMuU20oJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGI9MCxlLGQ9W107Yy5zaz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpLGI7Yj1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBlPSIiO2IucXVlcnlLZXkmJihlPWIucXVlcnlLZXkuaHZwKTtlJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBDKHRoaXMudXJsKTpsLnZhKGwuWGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7CnZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52cGFpZCYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfS5iaW5kKHRoaXMpLGM9ZnVuY3Rpb24oKXtyZXR1cm4gZCgpJiYoZi5SKCJtYXJ0aGFzdGV3YXJ0LmNvbSIpfHxmLlIoImZhbmRvbS5jb20iKXx8Zi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKX0uYmluZCh0aGlzKTtpZihkKCl8fGMoKSl7dmFyIGg9Zi5OZyh0aGlzLnVybCk7aHx8KGg9dGhpcy51cmwpO3ZhciBjPWZ1bmN0aW9uKCl7cmV0dXJuIDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4gMDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksbT1mdW5jdGlvbigpe3JldHVybihmLlIoImdpZ2EuZGUiKXx8Zi5SKCJraW5vLmRlIil8fGYuUigic3BpZWxldGlwcHMuZGUiKXx8Zi5SKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbj1mdW5jdGlvbigpe3JldHVybiAwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil8fDA8aC5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfS5iaW5kKHRoaXMpO2lmKGMoKXx8aygpfHxtKCl8fCJhcHBzcG90Ij09ZSluKCk/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5YZChoKSkrIiZ0eXBlPWpzIixiPWwudmEobC5YZCh0aGlzLnVybCksCiExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGYudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPWwudmEobC5YZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLlJtLmJpbmQodGhpcyksdGhpcy5PbS5iaW5kKHRoaXMpKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMub2EuZmlyc3RDaGlsZC5ub2RlTmFtZSYmCmEuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09Zi5OYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZVtiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goYyl7ZVtiXT17fX1lbHNlIGUuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgZT1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSwKYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWYuTmJ8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1mLk5ifHx0aGlzLkVtKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLnNvKCkpdHJ5e3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1jLmxlbmd0aCYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrY1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1nLmZpcnN0Q2hpbGQ7ZS5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksCmI9MDtiPGEubGVuZ3RoO2IrKyllLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGUpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LEVtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sZT10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrCjYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9ZT8hMDohMX0sUm06ZnVuY3Rpb24oYSl7dGhpcy54bihhKTt0cnl7dGhpcy5vYT1hLnJlc3BvbnNlWE1MLHRoaXMub2F8fCh0aGlzLm9hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5yaD1hLnVybENhbGxlZDtpZih0aGlzLlkubGVuZ3RoKXRoaXMuVmMoKTtlbHNle3RoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKTt0cnl7Zi50cmFjaygic3RhdHNfaGRfbXR5dXJsIixmLlVhKHRoaXMuYmEpLCEwKX1jYXRjaChlKXt9fX0sU206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMub2F8fAoodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuUmEodi5vZSkpfXRoaXMuWT10aGlzLmJoKCk7dGhpcy5CYz10aGlzLlNmKCk7dGhpcy56Yz10aGlzLmtpKCk7dGhpcy5ZLmxlbmd0aD90aGlzLlZjKCk6dGhpcy5yYSh0aGlzLlJhKHYuZmQse2Vycm9yOnRoaXMuYmc/Ri5uZTpGLmdnfSkpfSxPbTpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5SYSh2LmZnLHtkZXB0aDpifSkpfSxWYzpmdW5jdGlvbigpe3RoaXMuSj10aGlzLlkuc2hpZnQoKTt0aGlzLkltKCk/dGhpcy5BbygpPyhiKyssbmV3IGEodGhpcyx0aGlzLmxoKCksZSx7QWRTeXN0ZW06dGhpcy5TbCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuUmEodi5pZykpOihiPTAsdGhpcy5LbygpJiZ0aGlzLnVmKHRoaXMuQmwoKSkpfSxwZjpmdW5jdGlvbigpe3RoaXMuQmM/KHRoaXMuQmM9MTx0aGlzLlkubGVuZ3RoLAp0aGlzLlkubGVuZ3RoJiZ0aGlzLlZjKCkpOnRoaXMucGFyZW50LnBmKCl9LEloOmZ1bmN0aW9uKCl7dGhpcy56Yz8odGhpcy56Yz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5JaCgpfSxLbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhvKCk/dGhpcy53bygpPyEwOigtMSE9dGhpcy5OYygpP3RoaXMucmEodGhpcy5SYSh2LmhlKSk6dGhpcy5yYSh0aGlzLlJhKHYuZWcpKSwhMSk6KHRoaXMucmEodGhpcy5SYSh2LmZkLEYuaGcpKSwhMSl9LHVmOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmdlfHwoYS5nZT1bXSk7YS5nZS5wdXNoKHRoaXMucmgpO2EuT2E9YS5PYS5jb25jYXQodGhpcy5sZigpKTthLkViPWEuRWI/YS5FYjp0aGlzLkJjO2EueWM9YS55Yz9hLnljOnRoaXMuemM7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT8KYS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzt0aGlzLnBhcmVudC51ZihhKX0sQmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgU2E7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuZHVyYXRpb249dGhpcy5OYygpO2EuTj10aGlzLmloKCk7YS5yYj10aGlzLlVsKCk7YS55cT1bXTthLm9yaWdpbj10aGlzO2Eucz10aGlzLlJsKCk7YS5NZj10aGlzLmhtKGEuZHVyYXRpb24pO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy5iYS5pbmRleE9mKCJhZC55aWVsZGxhYi5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYztyZXR1cm4gYX0scmE6ZnVuY3Rpb24oYSl7dGhpcy5iYXx8KHRoaXMuYmE9IiIpO2EuWmE9YS5aYT9hLlphOi0xIT10aGlzLmJhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5NYzthLiRhPQphLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7aWYoIXRoaXMuSiYmdGhpcy5vYSYmdGhpcy5vYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLm9hO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGU9ITE7KGU9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmZS5sZW5ndGgmJmYudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuT2E9YS5lcnJvci5jb2RlIT12LmhlLmNvZGU/YS5PYS5jb25jYXQodGhpcy5WbCgpKTphLk9hLmNvbmNhdCh0aGlzLmRtKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQua2MmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5rYyYmdGhpcy5wYXJlbnQua2MoYSksYj0wLHRoaXMuVmMoKSk6KHRoaXMucGFyZW50JiYKdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYSksYj0wKX0sa2M6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQua2MoYSl9LFVnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLlJhKGEsYikpfSxSYTpmdW5jdGlvbihhLGIpe3ZhciBlPW5ldyBUYShhLGIpO2Uub3JpZ2luPXRoaXM7cmV0dXJuIGV9LEFvOmZ1bmN0aW9uKCl7cmV0dXJuIGI8ZX0seG86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmloKCkubGVuZ3RofSx3bzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuTmMoKX0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxraTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuU2YoKSYmCihhPSEwKTtyZXR1cm4gYX0seG46ZnVuY3Rpb24oYSl7dGhpcy5iYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLmJhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuYmE9IlVOS05PV04ifXRyeXt0aGlzLmJnPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGUpe319LEltOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5saCgpLmxlbmd0aH0sbGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSxTbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBkPWFbZV07W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7dHJ5e2lmKCJUcmFja2luZyI9PWQmJmEmJmEucGFyZW50Tm9kZSYmIlRyYWNraW5nRXZlbnRzIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lJiYoYS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJOb25MaW5lYXJBZHMiPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZXx8YS5wYXJlbnROb2RlLnBhcmVudE5vZGUmJiJDb21wYW5pb24iPT1hLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpcmV0dXJufWNhdGNoKGUpe31pZihhJiYhdGhpcy55aChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy50YihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LHloOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT0KYS5ub2RlTmFtZT8hMDp0aGlzLnloKGEucGFyZW50Tm9kZSk6ITF9LGRtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZigpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxVbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxpaDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKWIucHVzaCh7aWQ6YVtlXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2VdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFBhOmFbZV0uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtlXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksCmhlaWdodDphW2VdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksU3A6YVtlXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMudGIoYVtlXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUGF8fDFFMzt0cnl7dmFyIGM9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlBhKS1NYXRoLmFicyhkLWIuUGEpfSksZj1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUGEpLU1hdGguYWJzKGQtYi5QYSl9KSxiPWMuY29uY2F0KGYpfWNhdGNoKGgpe31yZXR1cm4gYn0sUmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGU9ITEsZD1bXSxiPSExLGM9IiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Yz1iPXRoaXMuR2QoYVtoXSk7dHJ5e2U9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtlPWJ9ZC5wdXNoKGUpO2YucHVzaChjKX0xPGEubGVuZ3RoPyhiPWQsaD1jKTooYj1lLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMudGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxobTpmdW5jdGlvbihhKXt2YXIgYj0hMSxlPSExLGQ9ITE7dHJ5e2U9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWUuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1mLmhvKGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGMpe2I9ITF9cmV0dXJuIGJ9LFFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy50YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sVGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHRiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuR2QoYSk6IiJ9LEdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuVGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLnNrfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuUGx8fFVhO25ldyBVYSgxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk9hPVtdO3RoaXMuTj1bXTt0aGlzLnJiPSIiO3RoaXMucz10aGlzLnljPXRoaXMuRWI9ITE7dGhpcy5YZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuWWU9IiJ9Yy5Zaj1hO2EucHJvdG90eXBlPXt2bDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxlPTA7ZTx0aGlzLk4ubGVuZ3RoO2UrKylpZigwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxibTpmdW5jdGlvbigpe2lmKCF0aGlzLlhlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ub2Epe3ZhciBhPXRoaXMub3JpZ2luLm9hO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxlPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKykoZT1hW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWUuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuWGU9YVtkXSl9cmV0dXJuIHRoaXMuWGV9LApnaDpmdW5jdGlvbigpe2lmKHRoaXMuWWUpcmV0dXJuIHRoaXMuWWU7dmFyIGE9IiI7KGE9dGhpcy5ibSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuWWU9YX0sbG06ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk5bZV07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLllqfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYWw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLmFsfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt2YXIgdj17b2U6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsTmE6IlhNTF9QQVJTRV9FUlJPUiJ9LGVnOnt0eXBlOiJlcnJvciIsY29kZToyMDIsCm1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTmE6IkRVUkFUSU9OX0VSUk9SIn0sZmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE5hOiJFTVBUWV9WQVNUIn0saWc6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTmE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LGZnOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApOYToiTE9BRF9FUlJPUiJ9LGtlOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixOYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LHNwOnt0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE5hOiJNRURJQUZJTEVfRVJST1IifSxoZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixOYToiRFVNTVlfQUQifX0sRj17Z2c6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixOYToiTk9fQURTIn0saGc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE5hOiJOT19NRURJQUZJTEVTIn0sdHA6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE5hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sbmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTmE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgV2E9Yy5HbHx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmVycm9yPWE7dGhpcy5BZD1lO3RoaXMuT2E9W107dGhpcy5vcmlnaW49bnVsbH1jLmhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5oanx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWGE9CmMubGt8fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5aaD1hO3RoaXMudmlkZW89ZTt0aGlzLmNlPVtdO3RoaXMuV2g9W107dGhpcy5yZj1bXTt0aGlzLlRvPSJsb2FkZWQgc3RhcnQgZmlyc3RRdWFydGlsZSBtaWRwb2ludCB0aGlyZFF1YXJ0aWxlIGNvbXBsZXRlIHBhdXNlIHJlc3VtZSBidWZmZXJTdGFydCBidWZmZXJGaW5pc2ggc2tpcHBlZCB2b2x1bWVDaGFuZ2UgcGxheWVyU3RhdGVDaGFuZ2UgYWRVc2VySW50ZXJhY3Rpb24iLnNwbGl0KCIgIik7dGhpcy5JKCl9Yy51cD1hO2EucHJvdG90eXBlPXtJOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLlpoLmxlbmd0aDthKyspe3ZhciBlPXRoaXMuWmhbYV0sZD1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCwKYz1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7dmFyIGg9Zi5jb250ZW50V2luZG93O2gubnE9e3JlZ2lzdGVyU2Vzc2lvbk9ic2VydmVyOnRoaXMuSm4uYmluZCh0aGlzKSxhZGRFdmVudExpc3RlbmVyOnRoaXMuQ24uYmluZCh0aGlzKX07dmFyIGs9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtrLnNyYz0iaHR0cHM6Ly9kZXYuc2NobmVldm9ubW9yZ2VuLmNvbS92aW5jZW50L3NhbmRib3gvc2FuZGJveF9zYS5qcyI7ay5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1oLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Euc3JjPWQ7aC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2guZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTsKdGhpcy5jZS5wdXNoKHtzcmM6ZCxmcmFtZTpmLG5uOmMsdmVuZG9yOmUuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLnJmLmxlbmd0aDtlKyspe3ZhciBkPXRoaXMucmZbZV07ZC50eXBlPT09YSYmZC5mbCh0aGlzLldsKGEpKX19LFdsOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICJsb2FkZWQiOnJldHVybnt0eXBlOiJsb2FkZWQiLGRhdGE6e3dxOiEwLHZxOjUsYXV0b3BsYXk6ITEscG9zaXRpb246InN0YW5kYWxvbmUifX07Y2FzZSAiaW1wcmVzc2lvbiI6cmV0dXJue3R5cGU6ImltcHJlc3Npb24iLGRhdGE6e2txOiJ2aWRlbyIsenE6ImpzQ3VzdG9tIixBcToiMS4wLjAtZGV2In19O2Nhc2UgInN0YXJ0IjpyZXR1cm57dHlwZToic3RhcnQiLGRhdGE6e2R1cmF0aW9uOjEwLEJxOjEsVHA6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIiwKZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sa206ZnVuY3Rpb24oYSl7Zm9yKHZhciBlPTA7ZTx0aGlzLmNlLmxlbmd0aDtlKyspaWYodGhpcy5jZVtlXS52ZW5kb3I9PT1hKXJldHVybiB0aGlzLmNlW2VdLm5uO3JldHVybiIifSxKbjpmdW5jdGlvbihhLGUpe3RoaXMuV2gucHVzaCh7b2JzZXJ2ZXI6YSx2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOnRoaXMua20oZSksdmVuZG9yOmV9KTt0aGlzLmpvKCl9LENuOmZ1bmN0aW9uKGEsZSl7InZpZGVvIj09PWE/dGhpcy5Uby5tYXAoZnVuY3Rpb24oYSl7dGhpcy56ZyhhLGUpfS5iaW5kKHRoaXMpKTp0aGlzLnpnKGEsZSl9LHpnOmZ1bmN0aW9uKGEsZSl7dGhpcy5yZi5wdXNoKHt0eXBlOmEsCmZsOmUsdHE6ITF9KX0sam86ZnVuY3Rpb24oKXt0aGlzLldoLm1hcChmdW5jdGlvbihhKXthLkJtfHwoYS5tcSh7YWRTZXNzaW9uSWQ6Zi5WKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS54cSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuQm09ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmpuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWE9Yy5qbnx8WWE7bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxlKXt0aGlzLmNvbmY9ZXx8e307dGhpcy5jPWE7dGhpcy5zYj1hLmRoKCk7dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSC5pZD0KZi5WKDEwKTt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5IYT17fTt0aGlzLkFnPSExO3RoaXMuZmM9W119Yy5laj1hO2EucHJvdG90eXBlPXtRbDpmdW5jdGlvbihhKXt2YXIgZT17fSxkPSExLGM9MCxlPTAsZj17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPSJmaXhlZCIsYz1lLmxlZnQsZT1lLnRvcCk7Zj17eDpjLHk6ZX07Zi5wb3NpdGlvbj1kO3JldHVybiBmfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlFsKGEpO2Zvcih2YXIgZT0wLGQ9MCxjPSExLGY9dGhpcy5xbShhKSxoPXt9O2E7KWUrPWEub2Zmc2V0TGVmdCsKYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxlKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxkKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihjPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmUseTpkfTtjJiYoaC5wb3NpdGlvbj1jKTtyZXR1cm4gaH0scW86ZnVuY3Rpb24oKXt0aGlzLkFnPSEwfSx2aTpmdW5jdGlvbigpe3RoaXMuQj1ELnBvcCgpO3RoaXMuQnx8KGYudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwKIiIsITApLHRoaXMuQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQi5pZD0iYWRYZGlzcGxheSIsdGhpcy5CLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LFBoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5jLmwoKSl9LE1uOmZ1bmN0aW9uKCl7dGhpcy5BZ3x8KHRoaXMuYy5wbGF5KCksZi5vKGsud2QsdGhpcy5jLmwoKSkpfSxLZjpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5jLnBhdXNlKCk7dGhpcy5ILnN0eWxlLnpJbmRleD1hO3RoaXMuSC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkguc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSC5zdHlsZS5ib3hTaXppbmc9dGhpcy5zYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuc2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkIuc3R5bGUud2lkdGg9dGhpcy5zYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5CLnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLnNiKTt0aGlzLmMuWmMmJnRoaXMuYy5aYygpP3RoaXMuYy5kaCgpLmFwcGVuZENoaWxkKHRoaXMuSCk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkgpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5jLmV4aXRGdWxsc2NyZWVuKCl9LHFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8ZSYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPQohMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gY30sTmw6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5nZXRQb3NpdGlvbihhKTtlLnBvc2l0aW9uP2UucG9zaXRpb249ZS5wb3NpdGlvbjplLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZS53aWR0aD1hLm9mZnNldFdpZHRoO2UuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0O3JldHVybiBlfSxtYzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLk5sKHRoaXMuc2IpO2lmKGUueCE9dGhpcy5IYS54fHxlLnkhPXRoaXMuSGEueXx8ZS5wb3NpdGlvbiE9dGhpcy5IYS5wb3NpdGlvbnx8ZS53aWR0aCE9dGhpcy5IYS53aWR0aHx8ZS5oZWlnaHQhPXRoaXMuSGEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuSGEud2lkdGgmJjA8dGhpcy5IYS5oZWlnaHQmJjA9PWUud2lkdGgmJjA9PWUuaGVpZ2h0KXt0aGlzLlZlKCk7cmV0dXJufXRoaXMuSGE9ZTt0aGlzLmMuWmMoKT8odGhpcy5ILnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5ILnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSC5zdHlsZS5sZWZ0PQplLngrInB4Iix0aGlzLkguc3R5bGUudG9wPWUueSsicHgiKTt0aGlzLkguc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijt0aGlzLkguc3R5bGUucG9zaXRpb249ZS5wb3NpdGlvbjt0aGlzLkIuc3R5bGUud2lkdGg9ZS53aWR0aCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9ZS5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5mYy5sZW5ndGg7YSsrKXRoaXMuZmNbYV0oe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSl9Zi5QZih0aGlzLkgpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSx5ZzpmdW5jdGlvbihhKXt0aGlzLmZjfHwodGhpcy5mYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuZmMucHVzaChhKX0sVmU6ZnVuY3Rpb24oKXt0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTsKdGhpcy5CJiZ0aGlzLkIucGF1c2UmJnRoaXMuQi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFphPWMuZWp8fFphLEQ9W10sJGE9MDsxMDA+JGE7JGErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWYuVigxMCk7TS5jb250cm9scz0hMDtELnB1c2goTSl9dmFyIEo9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBhYj1jLmFufHxhYjtuZXcgYWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuVChiKTt0aGlzLlJkKGEpO3RoaXMuUGcoKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZHx8KHRoaXMuaWQ9YSl9LFBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5UYSgpLGI9dGhpcy52aWRlb1RhZztifHwoKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuVyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGcoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiZhLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wYXJhbWV0ZXJzJiYhMT09PWEucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sbDpmdW5jdGlvbigpe3ZhciBhPXt9LGI9dGhpcy52aWRlb1RhZyxlPXRoaXMuVGEoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7YS5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYX19KX0pKGMpOwp2YXIgYmI9Yy5Tanx8YmI7KGZ1bmN0aW9uKGMpe2MuUmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRhKCk7dGhpcy5kYz10aGlzLmRjfHwhMTt0aGlzLnFnPXRoaXMuc2c9dGhpcy52aD10aGlzLnphPXRoaXMuVWY9ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5MbChhLGIpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52aCYmdGhpcy5HZygpfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLk1iO2EmJmEub2MmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudWQoKTt0aGlzLnZoPSEwO3RoaXMuR2coKX0uYmluZCh0aGlzKSk7dGhpcy5EZygpfSxHZzpmdW5jdGlvbigpe2lmKCF0aGlzLmRjKXt0aGlzLnVkKCk7aWYoIXRoaXMuVWYmJiF0aGlzLnVkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5VZiYmdGhpcy5xZyYmIXRoaXMuc2cmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSx1ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuamgoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0samg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmU9MDtlPGIubW9kdWxlcy5sZW5ndGg7ZSsrKXt2YXIgYz1iLm1vZHVsZXNbZV07aWYoYy5uYW1lPT09YSlyZXR1cm4gYy5pbnN0YW5jZX19LERnOmZ1bmN0aW9uKCl7aWYodGhpcy51ZCgpKXt2YXIgYT10aGlzLmpoKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuc2c9MDxhLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5xZz1hLlFwfXRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0sVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzQWRQbGF5aW5nP2EuaXEoKTohMX0sTmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QWREdXJhdGlvbj9hLk5jKCk6LTF9LGVtOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxMbDpmdW5jdGlvbihhLGIpe3RoaXMuZGM9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5kY3x8MzAyPT10aGlzLmRjP3RoaXMuemE9ITA6dGhpcy5tKCJhZGVycm9yIix0aGlzLmRjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfSx2ZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT8odGhpcy53KCksdGhpcy5qYSgpKTphLlplKCk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuZW0oYSk/KHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52ZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIGNiPWMuUmp8fGNiOyhmdW5jdGlvbihjKXtjLlRqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sRG06ZnVuY3Rpb24oKXt3aW5kb3cuT08uY2suR2suRWs/d2luZG93Lk9PLmNrLkdrLkVrLk9wKGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRtKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZhPTE1MDA7dmFyIGE9ZGEoKTtpZihhJiZhLl9faW50ZXJuYWwmJmEuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGYuU2UoYS5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYiBpbiBhLl9faW50ZXJuYWwucGxheWVycylpZihhLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGU9bmV3IGJiKGEuX19pbnRlcm5hbC5wbGF5ZXJzW2JdKTt0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBjYihlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgZGI9Yy5Uanx8ZGIsZWI9bmV3IGRiKHQpO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYj1jLmxufHxmYjtuZXcgZmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5XaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLmhhPSExO3RoaXMubWgoKX0sbWg6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2F8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpOwphJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuU2goKX0sU2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYT90aGlzLlgmJigwLHRoaXMuWCkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2goKX0uYmluZCh0aGlzKSwKMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZ2I9Yy5XaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuVmk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sRGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5jb2RlLGU9YS5tZXNzYWdlO2EuZGF0YSYmKGI9YS5kYXRhLmNvZGUsZT1hLmRhdGEubWVzc2FnZSk7MTIwNSE9YiYmKDkwMD09YiYmMDxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKSk6MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/dGhpcy5qYSgpOnRoaXMuaSgpKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHMpO2EucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLkRlKGEpfS5iaW5kKHRoaXMpKTsKYS5wbGF5ZXIub24oInBsYXlpbmciLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRlKGEuYWRFcnJvckV2ZW50cyl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGhiPWMuVml8fGhiOyhmdW5jdGlvbihjKXtjLlhpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVWg6ZnVuY3Rpb24oYSl7YT1uZXcgZ2IoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fChhLlJkKE1hdGguY2VpbCgxRTEwKgpNYXRoLnJhbmRvbSgpKSksdGhpcy5MKGEpLChuZXcgaGIoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NbHx8KHRoaXMuTWw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlVoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5VaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pO3RoaXMuTygpfX0pfSkoYyk7dmFyIGliPWMuWGl8fGliLFQ9bmV3IGliKHQpO1QuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGpiPWMuYmt8fApqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxaYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMubmt8fFU7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5uZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5obihhKX0uYmluZCh0aGlzKSk7dy5uZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKdy5uZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0saG46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZTtmb3IoZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkpe2I9aXNOYU4oYVtlXSk/ITE6YVtlXTtpZigxMDA5PT1hW2VdfHwxMDAxPT1hW2VdfHwzMDM9PWFbZV18fDQwMz09YVtlXSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGMgaW4gYVtlXSlpZihhW2VdLmhhc093blByb3BlcnR5KGMpJiYoYj1pc05hTihhW2VdW2NdKT8hMTphW2VdW2NdLDEwMDk9PWFbZV1bY118fDEwMDE9PWFbZV1bY118fDMwMz09YVtlXVtjXXx8NDAzPT1hW2VdW2NdKSl7dGhpcy53KCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkMoKX19KX0pKGMpO3ZhciBWPWMubWt8fFY7KGZ1bmN0aW9uKGMpe2Mub2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLk1kJiYoYT1mLkVsKGEsdGhpcy5NZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTChkKTt2YXIgZz1uZXcgVihkLHRoaXMuRik7Zy5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuTWR8fAoodGhpcy5NZD1bXSksdGhpcy5NZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5LKGQpfHwodGhpcy5MKGQpLGc9bmV3IFYoZCx0aGlzLkYpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLk8oKX0sbmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2F8fCh0aGlzLmNhPXt9KTt0aGlzLmNhW2FdfHwodGhpcy5jYVthXT17fSk7dGhpcy5jYVthXVtiXXx8KHRoaXMuY2FbYV1bYl09W10pO3RoaXMuY2FbYV1bYl0ucHVzaChjKX0sQm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYl0pdGhpcy5VY3x8KHRoaXMuVWM9W10pLHRoaXMuVWMucHVzaChhKSx0aGlzLkxuKCkmJih0aGlzLkFmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYl1bY10mJjA8dGhpcy5jYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPQowO2Q8dGhpcy5jYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuY2FbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuVWMpZm9yKHZhciBhPTA7YTx0aGlzLlVjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuVWNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuY2FbY11bZF1bZl0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9YS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ3LkJvKGEpfX0pfSkoYyk7dmFyIGtiPWMub2t8fGtiLHc9bmV3IGtiKHQpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5tcD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMubXB8fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sCnVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5TaXx8bWI7KGZ1bmN0aW9uKGMpe2MuVGk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2YuSmMucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2YuSmMucHVzaCh7IltoZWlnaHRdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0SGVpZ2h0fSk7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkOwphLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkMoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5DKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5UaXx8bmI7KGZ1bmN0aW9uKGMpe2MuVWk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGYpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbWIoZCk7dGhpcy5LKGgpfHwodGhpcy5MKGgpLChuZXcgbmIoaCx0aGlzLkYpKS5mKCkpfWNhdGNoKGspe319dGhpcy5PKCl9LEs6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5MYSlpZihiPT10aGlzLkxhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2Eua2EoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5VaXx8b2IscGI9bmV3IG9iKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMubnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYj1jLm5wfHxxYjtuZXcgcWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Paj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklnPXRoaXMuS2M9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dGhpcy50bHx8KGEudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudWwoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCk7dmFyIGI9dGhpcy5XZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuS2M9Yik7aWYoIXRoaXMuSWcmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGEuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgYz0KYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsaD1hLnNvdXJjZS5DSE9PU0VSX1RJTUV8fCIiO2YudHJhY2soInN0YXRzX2Nob29zZXJfYWIiLGMsITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfaW50ZXJhY3Rpb24iLGMrKHBhcnNlSW50KGgpPT1oPyIiOiJfYXV0b3BsYXkiKSwhMCk7Zi50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixoLCEwKTt0aGlzLklnPSEwfX19Y2F0Y2goayl7fX0uYmluZCh0aGlzKSk7dGhpcy5GZCgpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuQm4odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSx4ZzpmdW5jdGlvbihhKXt0aGlzLmhjfHwodGhpcy5oYz1bXSk7dGhpcy5oYy5wdXNoKGEpfSx1bDpmdW5jdGlvbigpe2lmKHRoaXMuaGMmJnRoaXMuaGMubGVuZ3RoKWZvcih2YXIgYT0KMDthPHRoaXMuaGMubGVuZ3RoO2ErKyl0cnl7dGhpcy5oY1thXSgpfWNhdGNoKGIpe319LEZkOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylyZXR1cm4gdGhpcy5LYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5XZyhhKSlyZXR1cm4gdGhpcy5LYz1hfX0sV2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LEJuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEucGF1c2UmJnRoaXMuZmEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmEubXV0ZSYmdGhpcy5mYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnVubXV0ZSYmdGhpcy5mYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHdoOmZ1bmN0aW9uKGEpe3RoaXMuZmE9YX0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMuT2p8fHJiOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpO3RoaXMuRWk9ITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMuRWkmJih0aGlzLmkoKSx0aGlzLkVpPSEwLHRoaXMubmEoKSk7Yi5UYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLkZkKCk/dGhpcy5DKCk6KHRoaXMuSmV8fCh0aGlzLkplPTEpLHRoaXMuSmUrKywxMDA8dGhpcy5KZT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHNiPWMuTmp8fHNiOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT0KYSgpfWNhdGNoKGIpe2YudHJhY2soIm9ubHlIT01BRENvbmZGYWlsZWQiLCIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHJiKGFbZF0pLHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IHNiKGMsdGhpcy5GKSkuZigpKX19ZWxzZSB0aGlzLk8oKX19KX0pKGMpO3ZhciB0Yj1jLlBqfHx0YixXPW5ldyB0Yih0KTtXLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yj1jLlBpfHx1YjtuZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuWD8oMCx0aGlzLlgpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmI7KGZ1bmN0aW9uKGMpe2Mud2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sUGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LHpuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5oYnx8KHRoaXMuaGI9W10pO3RoaXMuaGIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLmphKCk6dGhpcy5tKCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuem4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5QYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxpOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkMoKTtyZXR1cm59aWYoIXRoaXMuQ2Mpe3RoaXMuQygpO3JldHVybn1hPSEwO2lmKHRoaXMuaGImJnRoaXMuaGIubGVuZ3RoJiYxPHRoaXMuaGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5oYi5sZW5ndGgtCjE7YisrKTEwMDkhPXRoaXMuaGJbYl0mJjMwMyE9dGhpcy5oYltiXSYmNDAzIT10aGlzLmhiW2JdJiYoYT0hMSk7aWYoYSl0aGlzLncoImVtcHR5IiksdGhpcy5qYSgpO2Vsc2V7dGhpcy5DKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy53a3x8d2I7KGZ1bmN0aW9uKGMpe2MueWs9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB2YihhLml0ZW0oYikpO3RoaXMuSyhjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTChjKSwobmV3IHdiKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciB4Yj1jLnlrfHwKeGIseWI9bmV3IHhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHpiPWMuTWp8fHpiO25ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnZmPSExfSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zbigpfS5iaW5kKHRoaXMpLDUwMCl9LHNuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLApiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlgmJnRoaXMuWCgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnZmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnZmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmCmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LG1vOmZ1bmN0aW9uKCl7dGhpcy52Zj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuaGt8fEFiOyhmdW5jdGlvbihjKXtjLmdrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51Yz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5WbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudWN8fCh0aGlzLnVjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuaSgpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLnVjfHx0aGlzLnVjKyssdGhpcy51Yzw9dGhpcy5WbT8odGhpcy51YysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkubW8oKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuZ2t8fEJiOyhmdW5jdGlvbihjKXtjLmlrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmI9ITE7YSYmYVswXSYmKGI9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBCYihhLHRoaXMuRikpLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIENiPWMuaWt8fENiLERiPW5ldyBDYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuUWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBFYj1jLlFqfHxFYjtuZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5laz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKdGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuWCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5la3x8RmI7KGZ1bmN0aW9uKGMpe2MuZGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuVGEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLndsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuSWIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5NbSgpOnRoaXMuRmcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmkoITApKX0uYmluZCh0aGlzKSwxRTMpfSx3bDpmdW5jdGlvbigpe3RoaXMub2coKXx8dGhpcy5pKCEwKX0sTW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliKCk7IWEucGEmJmEuWSYmYS5OcCYmYS5QcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmkoKSl9LEZnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkZnKCl9LmJpbmQodGhpcyksMTAwKX0sSWI6ZnVuY3Rpb24oKXtpZighdGhpcy5NaClmb3IodmFyIGE9Yy5nZC5JYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5UYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5NaD1hW2VdKTtyZXR1cm4gdGhpcy5NaH0sanE6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0saTpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuSWIoKS5hZHNMb2FkZXI/dGhpcy5DKCEwKTp0aGlzLkMoKTp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEdiPWMuZGt8fEdiOyhmdW5jdGlvbihjKXtjLmdkPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbmw6ZnVuY3Rpb24oYSl7YT1uZXcgRmIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhhKXx8KHRoaXMuTChhKSwobmV3IEdiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuZ2QuSWIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLm5sKGFbYl0pO3RoaXMuTygpfX0pO2MuZ2QuSWI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEhiPWMuZ2R8fEhiLEliPW5ldyBIYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLnBwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSmI9Yy5wcHx8SmI7bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuS2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0saHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sWmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sVGE6ZnVuY3Rpb24oKXt2YXIgYTtHPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLktqfHxYOyhmdW5jdGlvbihjKXtjLkpqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLndmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMud2Y9YS5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy53ZiYmYyE9dGhpcy53Znx8ImFkZXJyb3IiIT1hLmV2ZW50fHxmLlIoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLm9xKSx0aGlzLkMoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBZPWMuSmp8fFk7KGZ1bmN0aW9uKGMpe2MuTGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEcpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFgoYSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFgoYSksYS5oYT90aGlzLkFmKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IFkoYSx0aGlzLkYpLGEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBHLEtiPWMuTGp8fEtiLExiPW5ldyBLYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTWI9Yy5Wb3x8TWI7bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpOnRoaXMuVSgpOnRoaXMuVSgpfSxiaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2E/Yi5Jc1BhdXNlZCgpJiZiLlBsYXkoKTooYi5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgTmI9Yy5wanx8TmI7KGZ1bmN0aW9uKGMpe2Mub2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTT10aGlzLk18fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5DZSgpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJgoiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLm5hKCl9LmJpbmQodGhpcykpfSxDZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5HZXRBZEVycm9yc0NhY2hlKCksYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaGFuZGxlRXJyb3IoYltjXSk7YS5DbGVhckFkRXJyb3JzQ2FjaGUoKX0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkNlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7CnZhciBPYj1jLm9qfHxPYjsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrO2F8fChhPXdpbmRvdy5UT25saW5lTWVkaWFwbGF5ZXJGcmFtZXdvcmspO2lmKGEmJmEuR2V0QWxsUGxheWVycyYmKGE9YS5HZXRBbGxQbGF5ZXJzKCkpJiYwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTmIoYVtiXSk7Yy5oYXx8dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgT2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFBiPWMucWp8fFBiLFFiPW5ldyBQYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYj1jLmZrfHxSYjtuZXcgUmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWmk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSExLGM9ITE7YT8oYz1hLmVsLChiPWEuZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlUoKSk6dGhpcy5VKCl9LGJpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMucGxheWVyLm11dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCcmlkUGxheWVyIn0sZm46ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIFNiPWMuWml8fFNiOyhmdW5jdGlvbihjKXtjLiRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYWRkKCJhZEVycm9yIix0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcykpO2EuYWRkKCJhZEZpcnN0UXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRNaWRwb2ludCIsdGhpcy53LmJpbmQodGhpcykpO2EuYWRkKCJhZFRoaXJkUXVhcnRpbGUiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgVGI9Yy4kaXx8VGI7KGZ1bmN0aW9uKGMpe2MuYWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5CcmlkJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5CcmlkLnBsYXllcnMpe3ZhciBhPXdpbmRvdy5CcmlkJiZ3aW5kb3cuQnJpZC5wbGF5ZXJzLGI7Zm9yKGIgaW4gYSl7dmFyIGM9bmV3IFNiKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSx3aW5kb3cuYnJpZHBsYXllcj1jLChuZXcgVGIoYyx0aGlzLkYpKS5mKCkpfX10aGlzLk8oKX19KX0pKGMpO3ZhciBVYj1jLmFqfHxVYixWYj1uZXcgVWIodCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdiPWMuV2t8fFdiO25ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0paWYoKGE9YVswXSkmJiJBZHZlcnRpc2VtZW50Ij09YS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpdGhpcy5VKCk7ZWxzZXtmb3IodmFyIGI9YTtiJiZiLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWIucGFyZW50Tm9kZS5ub2RlTmFtZSl7Yj1iLnBhcmVudE5vZGU7YnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuVSgpfSxhZTpmdW5jdGlvbihhKXt2YXIgYj0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LEFuOmZ1bmN0aW9uKCl7dGhpcy5lZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmVkfHwodGhpcy5lZD0hMCx0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYil7fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0scGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLmVkJiYKKHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5lZD0hMSksdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx1YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFhiPWMuQmt8fFhiOyhmdW5jdGlvbihjKXtjLkFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5WaC5iaW5kKHRoaXMpLDEwKX0sZ2M6ZnVuY3Rpb24oYSl7dmFyIGI9e307YS5nZXRFcnJvciYmKGEuZ2V0RXJyb3IoKSxiPWEuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGU/KGIuZ2V0RXJyb3JDb2RlKCksdGhpcy5tKCJhZGVycm9yIixiLmdldEVycm9yQ29kZSgpKSx0aGlzLkhrPSEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fAozMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmkoKSk6KHRoaXMuSGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmdjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5sZy5iaW5kKHRoaXMpLDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlZoKCk7dGhpcy5sZygpO3RoaXMuRG4oKX0sRG46ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcmVxdWVzdC1hZHMtZmFsbGJhY2siLHRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy55bj90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy55bj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmdjKGEpKX19KX0pKGMpO3ZhciBZYj1jLkFrfHxZYjsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBhPW5ldyBYYih3aW5kb3cuREw4X0dMT0JBTFMpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhLkFuKCksYT1uZXcgWWIoYSx0aGlzLkYpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5nby5iaW5kKGEpKSwKYS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIFpiPWMuQ2t8fFpiLCRiPW5ldyBaYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy5rbnx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5RaD0hMTt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9Nb2RlbCl7dmFyIGI9YS52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGIpe3RoaXMuVChiKTt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlcoYyksYS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy4kbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9ZWxzZSB0aGlzLlUoKX0sYmk6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxiKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG19LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLiRkKGEpfS5iaW5kKHRoaXMpKX0sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmIXRoaXMuUWgmJih0aGlzLlFoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE49Yy5xa3x8TjsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuT2UpaWYodGhpcy5PYnx8Cih0aGlzLk9iPTApLHRoaXMuT2IrKywxNTx0aGlzLk9iKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLlpuKCk6dGhpcy5pKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmkoKTp0aGlzLmkoITApfWVsc2UgaWYoYT1hLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLApmdW5jdGlvbihhKXt0aGlzLmVhKGEpO3RoaXMueGIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5NKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5NPWEsYi5tKCJhZGVycm9yIixhKSk6Yi5tKCJhZGVycm9yIil9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz0KYS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQmEoKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBPPWMucGt8fE87KGZ1bmN0aW9uKGMpe2Mucms9CnAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlZhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8dGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IE8oYSx0aGlzLkYpLGEuZigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihiIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGIpJiZ3aW5kb3cuVFYyUGxheWVyc1tiXS52aWRlb01vZGVsJiYoYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksYS5oYXx8CnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuQWYoKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBiYz1jLnJrfHxiYyxjYz1uZXcgYmModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkZsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZGM9Yy5GbHx8ZGM7bmV3IGRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuR2o9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKTtiJiZ0aGlzLlQoYi5wYXJlbnROb2RlKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Hanx8WjsoZnVuY3Rpb24oYyl7Yy5Gaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zaD0wO3RoaXMuTT10aGlzLk18fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy56YT10aGlzLlJjPXRoaXMuQmE9dGhpcy5wZD0hMTt0aGlzLlRoPWYuU2IoMTApO3RoaXMuQWgoKX0sQWg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuc3ViUGxheWVyJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMucGE9YS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlciwKdGhpcy55YigpLCEwO3RoaXMuc2grKztpZigxMDx0aGlzLnNoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmkoITApOnRoaXMuaSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQWguYmluZCh0aGlzKSwxMDApLCExfSx5YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmVhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmRhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWIoKX0uYmluZCh0aGlzKSwyMCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT0KYS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTT1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0KITB9LGRhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YigpPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkMoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuRmp8fGFhOyhmdW5jdGlvbihjKXtjLkhqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBaKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFood2luZG93LnBsYXllciksdGhpcy5LKGEpfHwodGhpcy5MKGEpLGE9bmV3IGFhKGEsdGhpcy5GKSxhLmYoKSkpO3RoaXMuTygpfX0pfSkoYyk7dmFyIGVjPWMuSGp8fGVjLGZjPW5ldyBlYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYz1jLklvfHxnYztuZXcgZ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSwKYj10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31hJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBoYz1jLm1qfHxoYzsoZnVuY3Rpb24oYyl7Yy5saj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5FZygpfSxFZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuQygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGljPWMubGp8fAppYzsoZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGEmJiJESVYiPT1hLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7YT1uZXcgaGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGEuaGEpe3RoaXMuTygpO3JldHVybn1pZighdGhpcy5LKGEpKXt0aGlzLkwoYSk7KG5ldyBpYyhhLHRoaXMuRikpLmYoKTt0aGlzLk8oKTtyZXR1cm59fXRoaXMuTygpfX0pfSkoYyk7dmFyIGpjPWMubmp8fGpjLGtjPW5ldyBqYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucnA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYz1jLnJwfHxsYztuZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuSWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7YT8odGhpcy5UKGEpLChhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVyhhKTp0aGlzLlUoKSk6dGhpcy5VKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBtYz1jLklpfHxtYzsoZnVuY3Rpb24oYyl7Yy5IaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTthLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSk7dGhpcy5CZSgpO3RoaXMuQ2coKX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnphPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2JdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQ2cuYmluZCh0aGlzKSwKNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5CZS5iaW5kKHRoaXMpLDEwMCl9LEJlOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWEuZ2V0UGxheVN0YXRlKCk/YS5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6YS5fcGxheWVyT3B0aW9ucyYmYS5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGEuX2FkUmVnaXN0ZXJlZD90aGlzLmkoKTp0aGlzLmkoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfX0saTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkMoYSl9fSl9KShjKTt2YXIgbmM9Yy5IaXx8bmM7KGZ1bmN0aW9uKGMpe2MuSmk9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxTYTpmdW5jdGlvbihhKXthPQpuZXcgbWMoYSk7YS5oYT90aGlzLk8oKTp0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBuYyhhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5PKCl9fSl9KShjKTt2YXIgb2M9Yy5KaXx8b2MscGM9bmV3IG9jKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5NaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHFjPWMuTWl8fHFjO25ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5CaD10aGlzLkRoPXRoaXMuQ2g9ITE7dGhpcy5PZD1bXTt0aGlzLnpmPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBUP251bGw6VCxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEVhP251bGw6RWEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEliP251bGw6SWIsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgY2M/bnVsbDpjYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3P251bGw6dyxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIExiP251bGw6TGIseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2YgJGI/bnVsbDokYixHb3JpbGxhTWVkaWFwbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYixCcmlkUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBiP251bGw6cGIsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGViP251bGw6ZWIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBEYj9udWxsOkRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeWI/bnVsbDp5YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBXP251bGw6V319Yy4kaj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLmZtKGEpOltdLGM7dGhpcy5EaD0hMDtpZihhLmxlbmd0aCl7dGhpcy5DaD0KITA7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYz1hW2RdLHRoaXMuYWkoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLnpmKXtpZih0aGlzLkJoKWJyZWFrO2M9dGhpcy56ZltkXTt0aGlzLlhmKGMpJiYodGhpcy5PZC5wdXNoKGMpLHRoaXMuYWkoYykpfX0sWGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBwPyEwOiExfSxmbTpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZD1hW2ZdLGQ9dGhpcy56ZltkXSx0aGlzLlhmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuWGYoYSkmJmEuZigpfSxvbzpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgciYmIXRoaXMuQ2gpZm9yKHRoaXMuQmg9ITAsYT0wO2E8dGhpcy5PZC5sZW5ndGg7YSsrKXRoaXMuT2RbYV0uWmImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZFthXS5aYil9fX0pKGMpO3ZhciByYz0KYy4kanx8cmMsTD1uZXcgcmM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkttPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgc2M9Yy5LbXx8c2M7bmV3IHNjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLQoxKSxmLkxjKGsuTG8pLGYudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihmLkxjKGsuZW4pLGYudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgdmM9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSx3Yz1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgSD1uZXcgSSxtPSExO0guZ2EoKTtILnhoKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5nYSgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueGgoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5nYSgpO2YuTmUod2luZG93LGYuVigxMCkse30pO3ZhciBpYT1mLlYoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdGM9Yy5kanx8dGM7bmV3IHRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLlJoPXRoaXMuY29uZj10aGlzLkxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5KZD0wO3RoaXMuZ2I9IiI7Zi52YigibmV3QWRkZWxpdmVyeSIpfWMuS2k9YTthLnByb3RvdHlwZT17Vm46ZnVuY3Rpb24oYSl7dGhpcy5SaD1hfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuZ2I9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LApSbjpmdW5jdGlvbihhKXt0aGlzLkxiPWF9LFFuOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxKYTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuZ2JdJiZ0aGlzLmNvbmZbdGhpcy5nYl1bYV0mJihjPXRoaXMuY29uZlt0aGlzLmdiXVthXSk7cmV0dXJuIGN9LCRjOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITEsZz0hMTtpZih0aGlzLnVtKCkpdGhpcy5MYi5nKHRoaXMuTGIuUWMsdGhpcy5MYi5xYSx0aGlzLkxiLnlmLGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMuTGIuaWMpO2Vsc2UgaWYobC5EYiYmIWwuR2kpbC5UbShmdW5jdGlvbigpe3RoaXMuJGMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YubyhrLkhjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLG09bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksaCk7YyYmbS5xbygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTsKUT1tPW5ldyBRYShtLHRoaXMuTGIsaCk7bS5Obih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIHA9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYocD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKHApfWF8fGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLmdmJiYoZD10aGlzLnBsYXllci5nZigpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bS5qZihhLGQsZyk7dGhpcy5wbGF5ZXIuZGkobSl9fSx1bTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGM9MDtpZih0aGlzLkpkKXJldHVybiBjPWEuZ2V0VGltZSgpLXRoaXMuSmQuZ2V0VGltZSgpLHRoaXMuSmQ9YSwzRTU8Yz8hMDohMTt0aGlzLkpkPWE7cmV0dXJuITF9LGZvOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuVmcoYSkpP3RoaXMuJGMoYSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX0sZW86ZnVuY3Rpb24oYSl7aWYoIXRoaXMuUmgpe2YuRmYoInBvc3Ryb2xsIik7Zi52YigicG9zdHJvbGwiKTt0aGlzLlZuKCEwKTt2YXIgYz10aGlzLmNvbmYsZD10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGQ9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoZD10aGlzLlZnKGQpKT90aGlzLiRjKGQsYy5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLApmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LFZnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGM9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYz10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGMpfXJldHVybiBhfSxHbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLmJvKHRoaXMuZW8uYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sVGQ6ZnVuY3Rpb24oYSl7Zi52YigibWlkcm9sbCIpO2YuRmYoIm1pZHJvbGwiKTtpZighdGhpcy5HaCl7dGhpcy5HaD0hMDt2YXIgYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYz10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yz8odGhpcy4kYyhjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCwKdGhpcy5wbGF5ZXIubCgpKSl9fSxGbjpmdW5jdGlvbigpe3RoaXMucGxheWVyLlVuKHRoaXMuVGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubWYoKX0sZjpmdW5jdGlvbigpe3RoaXMuZm8oKTt0aGlzLnBsYXllci5tZiYmdGhpcy5GbigpO3RoaXMuR24oKX19fSkoYyk7dmFyIGZhPWMuS2l8fGZhLFE9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWM9Yy55anx8dWM7bmV3IHVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIil9KS5jYWxsKGJhZXJhZUhpVGhlcmVpbmcsYmFlcmFlSGlUaGVyZWluZyk7Cg==
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

Request headers

Referer
https://videos.giga.de/embed/176875
Origin
https://videos.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Thu, 05 Mar 2020 06:17:25 GMT
Server
TornadoServer/5.0
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
109
5303510603
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5303510603
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
52.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5303510603
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/ Frame CBD8
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/209/runner.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
5727
date
Thu, 05 Mar 2020 05:29:56 GMT
expires
Fri, 05 Mar 2021 05:29:56 GMT
last-modified
Tue, 25 Feb 2020 17:32:01 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
2849
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
sodar
pagead2.googlesyndication.com/getconfig/ Frame 6944
7 KB
5 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020022701&st=env
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js?21065627
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
7350b2da3a9331eab4f610761a72e897f2cb4a7e459eb46d8d0238cb55466ccd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
private
content-disposition
attachment; filename="f.txt"
content-type
application/json; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5188
x-xss-protection
0
data
lb46.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb46.s400.meetrics.net/data?/K06kGWZAATkzF8PBAAmUA9BAHbosAPAAAsEAYJAMbosAPAAAtGA9BAHl5/APAAAYLAaBAMl5/ARksFAQtjFa3BOSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:25 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 05-Mar-20 06:17:24 GMT
data
lb46.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb46.s400.meetrics.net/data?/K06kHWZAA/k0FkQmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A0zA2wAmvFytFh0FjvFklF94Et1EurFuvF3uFtzAx4EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAz1AxwA2wAzmAjpFk9BxzA4zAwzA34Ay5Az4AmzEp6Fl9BzxA4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1zAwzA1xAw2AwzAmhEwkF91AzwAz1AxwA2wAzmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A02A5zAmvFytFh0FjvFklF94Et1EurFuvF3uFtzAz4EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAyzA00A3xA3mAjpFk9BxzA4zAwzA0xA30Ay1AmzEp6Fl9BzzA4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9zEr5FmhEwjF91AzwAyzA00A3xA3mAhwFk9B1zAwyAz0A03Ax3AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A04AzwAmvFytFh0FjvFklF94Et1EurFuvF3uFtzA04EzxAmhEk2F90A1zA5zAw2A22A0mAjwFpkF9kElzFr0FvwFmhEwhF91AzwAz1AxwA15A3mAjpFk9BxzA4zAwzA0xA23A3xAmzEp6Fl9Bz0A4zBxmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF91AzwAz1AxwA15A3mAhwFk9B1zAwzA1xAw1A53AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14AzzA45Aw0A11A4xALlnFETkzFARksFAQtjFeZh9YA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:25 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 05-Mar-20 06:17:24 GMT
sodar2.js
tpc.googlesyndication.com/sodar/ Frame 6944
14 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020022701.js?21065627
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582746470043195"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5456
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:25 GMT
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/ Frame 9DDA
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/209/runner.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
5727
date
Thu, 05 Mar 2020 05:29:56 GMT
expires
Fri, 05 Mar 2021 05:29:56 GMT
last-modified
Tue, 25 Feb 2020 17:32:01 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
2849
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
gen_204
pagead2.googlesyndication.com/pagead/ Frame B57A
0
60 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020022701&jk=3831497916287387&bg=!dHeld29YXLnU14XaHLUCAAAASlIAAAAPmQFdyIjwNhcKvysS5Zp8hvsul9FEiOXHnxq-XdRS_IlpthrARzk8AgLCONogoCN5SuDKxpWgPfSsO0UIeog2PfnR4QOCXZdRxs1kgr6H3ammKuAa9Jmwkbt5FyckwO6z4f1A-DCNRg1moPXsVBn-jTpENkCWYR54wl2eLeRZ3Jzq9hq3WAH8alpFT6LFiQuhB2YTvXX0B5IGvhb1q4nYEGEn2CD7e35YmdpJJ6EBt6IaB77mrLKWMtUTCk0PT_yaPxHHD_rprwU8QaYx-ZgDJVymtOzdtGnDuKYzAoYgNhYE5mogzH1ef2bqW7vfJp2ePI9mE1ijnlWcTazIdg7zuENky5XrizeSpcnhznMsZOpLRrTJW9iOZm4pkQKmNUPmt2YecYRX2h6rBivg_YMOu_2TtMp-kBmQi7MYgAO3acHtnxtGRupIR8FOFhXh1jy0Q7Lps5jRjrV6ydGDR3MiUA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:25 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
track.adform.net/Serving/Cookie/
73 B
495 B
Script
General
Full URL
https://track.adform.net/Serving/Cookie/?adfaction=getjs;adfcookname=uid
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.6.241 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:13 GMT
content-encoding
gzip
server
nginx
access-control-allow-origin
*
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
strict-transport-security
max-age=31536000; includeSubDomains
content-type
text/javascript; charset=utf-8
content-length
180
expires
-1
f9b17833-d68c-4e4d-b319-d6061d45aa9f
boot.pubstack.io/v1/tag/
1 KB
837 B
Script
General
Full URL
https://boot.pubstack.io/v1/tag/f9b17833-d68c-4e4d-b319-d6061d45aa9f
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
108.128.27.24 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-108-128-27-24.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
55ba1afca9b98725818e30608b01c51bbe71a4f5580cf5aa45932fc95271cdd7

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

status
200
date
Thu, 05 Mar 2020 06:17:25 GMT
cache-control
private, max-age=120
content-encoding
gzip
content-length
718
content-type
application/javascript
config.json
gocp.stroeermediabrands.de/absconf/www.giga.de/
22 KB
22 KB
Fetch
General
Full URL
https://gocp.stroeermediabrands.de/absconf/www.giga.de/config.json?c=1583389045
Requested by
Host: gocp.stroeermediabrands.de
URL: https://gocp.stroeermediabrands.de/trackcp.js
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
c2088d78cab052f661280ebe9df7a1d0d3c3f0c8fcf0e16aa03868b35c1815d9

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Thu, 05 Mar 2020 06:17:26 GMT
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Transfer-Encoding
chunked
X-config-source
remoteConfig
Content-Type
application/json; charset=UTF-8
sodar
pagead2.googlesyndication.com/getconfig/
7 KB
5 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gda&tv=r20200303&st=env
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200303/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
3359748fa01c9e7f2a97c2cf1acd9b157995e7b8e11569ac083d767ade4e3078
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
private
content-disposition
attachment; filename="f.txt"
content-type
application/json; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5164
x-xss-protection
0
cmTagFEED_MANAGER.js
vidstat.taboola.com/vpaid/units/27_4_4/infra/
692 KB
153 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/27_4_4/infra/cmTagFEED_MANAGER.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/lite-unit/1.0.7/UnitFeedManagerDesktop.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
88fc085c6a5f93725f2e1c4cc4180fb1a6b7666a92ed36230e7dc613a39128cc

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
via
1.1 7ed7afde326861e358c3c83359e99895.cloudfront.net (CloudFront), 1.1 varnish
age
318605
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
x-cache-hits
260054
content-encoding
gzip
content-length
156747
x-served-by
cache-hhn4022-HHN
last-modified
Sun, 01 Mar 2020 13:45:24 GMT
server
AmazonS3
x-timer
S1583389046.727363,VS0,VE0
etag
"f2698b1dc949f8d373fe50a4cf956128"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA6-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
sKqETaUcHJeFowWsUxPj_qVLkXFwfezpOJXslvd0nASV-QHCf3jqMA==
x-amz-meta-mtime
1583070315
cmOsUnit.css
vidstat.taboola.com/vpaid/units/27_4_4/assets/css/
35 KB
7 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/units/27_4_4/assets/css/cmOsUnit.css
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/lite-unit/1.0.7/UnitFeedManagerDesktop.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
099ae698b2292d7ec4a45c32230ac80d194d9d8cebebd634f38a2e132535d209

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
style

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
via
1.1 163be08bc1bc44818353c4fd88655bee.cloudfront.net (CloudFront), 1.1 varnish
age
318605
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
x-cache-hits
311544
content-encoding
gzip
content-length
6391
x-served-by
cache-hhn4022-HHN
last-modified
Sun, 01 Mar 2020 13:45:21 GMT
server
AmazonS3
x-timer
S1583389046.712728,VS0,VE0
etag
"76bd13a8460ed90f741d58a4422b501d"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA6-C1
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
X_F2SWIYTA6g-KF_rpBuNiQNTrxrLHAz-F8oROa_DWUNDWE24EEm2A==
x-amz-meta-mtime
1583070311
tr
www.facebook.com/
44 B
254 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f12d:83:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT, Thu, 05 Mar 2020 06:17:25 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
no-cache, must-revalidate, max-age=0
alt-svc
h3-27=":443"; ma=3600
content-length
44
expires
Thu, 05 Mar 2020 06:17:25 GMT
sodar2.js
tpc.googlesyndication.com/sodar/
14 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200303/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582746470043195"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5456
x-xss-protection
0
expires
Thu, 05 Mar 2020 06:17:25 GMT
t.png
gocp.stroeermediabrands.de/
98 B
355 B
Image
General
Full URL
https://gocp.stroeermediabrands.de/t.png?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&contentPieceId=2857946&publishDate=2016-09-22T12%3A38%3A19%2B02%3A00&_=1583389045722.-378102029
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

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Date
Thu, 05 Mar 2020 06:17:25 GMT
Last-Modified
Wed, 04 Mar 2020 07:00:03 GMT
ETag
"5e5f51f3-62"
Content-Type
image/png
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Content-Length
98
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/ Frame 1ED5
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/209/runner.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
5727
date
Thu, 05 Mar 2020 05:29:56 GMT
expires
Fri, 05 Mar 2021 05:29:56 GMT
last-modified
Tue, 25 Feb 2020 17:32:01 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
2849
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

x-amz-version-id
.QpYJyF1nNEXAiEv_p5HZ8WppyW2y5XH
Content-Encoding
gzip
Last-Modified
Thu, 13 Feb 2020 21:01:42 GMT
Server
AmazonS3
x-amz-request-id
1C9E1D99AB6C0602
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Thu, 05 Mar 2020 06:17:26 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
F0zaYWQhgxhwKXZIsZOm3BHfl0RdKzidf5xoeSPN9xKkap+GTT5aLA1/B+RuiMyEQALKYBQef3k=
adex.js
dmp.theadex.com/d/285/5184/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/285/5184/s/adex.js?ts=68200574
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.103 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
5318e6f99439de8be22212f030c069a25e38feb81952f4fed93121eed1aef3b4

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:28 GMT
content-encoding
gzip
last-modified
Thu, 16 Jan 2020 08:30:04 GMT
server
nginx
etag
W/"5e201f0c-9d13"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Thu, 05 Mar 2020 06:22:28 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
0
316 B
Script
General
Full URL
https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
194.213.222.30 Hrusovany u Brna, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn3.bbmedia.cz
Software
ibillboard /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Thu, 05 Mar 2020 06:17:26 GMT
Last-Modified
Thu, 27 Feb 2020 10:44:01 GMT
Server
ibillboard
ETag
"5e579d71-0"
Content-Type
application/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
0
Expires
Wed, 11 Mar 2020 11:47:07 GMT
default.js
ups.xplosion.de/loader/69511/
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/69511/default.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.76.119.33 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-76-119-33.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
c66d3c57676253019cfd4315afeead909efc06b27b54a85a6debce549fb1f53e

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

status
200
date
Thu, 05 Mar 2020 06:17:26 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
1711
content-type
text/javascript
tag.js
js.agkn.com/prod/v0/
3 KB
3 KB
Script
General
Full URL
https://js.agkn.com/prod/v0/tag.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.4e690207aee080cc0182c4dd8e7e39dc.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20eb:c000:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 02:19:31 GMT
via
1.1 eab88762658052b4a1e386f8521a38cf.cloudfront.net (CloudFront)
last-modified
Tue, 22 Oct 2019 20:22:52 GMT
server
AmazonS3
age
14276
etag
"f53f55cbab099be3a970b446a66c496a"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA2-C1
accept-ranges
bytes
content-length
3167
x-amz-cf-id
SJvhsox29bvdI-H2J9xXzCNSD68EZx0ZfUwqlZ1t1URuSV4xu5Ilhw==
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
582 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=12319282&src.id=Stroeer
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.186.238.175 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
175.238.186.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:28 GMT
via
1.1 google
server
Apache
p3p
CP="NON DSP COR NID CURa PSAa PSDa OUR STP UNI COM NAV STA LOC OTC",policyref="/w3c/p3p.xml"
status
200
cache-control
no-cache, no-store, must-revalidate
content-type
image/gif;charset=UTF-8
alt-svc
clear
content-length
43
x-application-context
application
expires
Thu, 01 Jan 1970 00:00:00 GMT
PMS.js
vidstat.taboola.com/PMS/3.0.4/
48 KB
16 KB
Script
General
Full URL
https://vidstat.taboola.com/PMS/3.0.4/PMS.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/27_4_4/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
7cf9398d48d182ac1ad5a4c1199ca08e9431b984220b624580a16125017aa085

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:26 GMT
via
1.1 021f80d2384d9f4998f4098fa306be09.cloudfront.net (CloudFront), 1.1 varnish
age
1200823
x-cache
Miss from cloudfront, HIT
status
200
content-encoding
gzip
content-length
15570
x-served-by
cache-hhn4022-HHN
last-modified
Thu, 20 Feb 2020 08:38:58 GMT
server
AmazonS3
x-timer
S1583389046.226489,VS0,VE0
etag
"4777ebbbf6094efac88b18c1d3169f27"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53
accept-ranges
bytes
x-amz-cf-id
Y4KXpHj4sAHX6fahjme0ZcWx80hmR_jbb7qWjZXg44lCJzRLUNmYEg==
x-cache-hits
317356
gen_204
pagead2.googlesyndication.com/pagead/ Frame 5912
0
51 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020022701&jk=992126920691706&bg=!09Cl0MhYrvbGLKJiM1kCAAAATlIAAAAdmQFdxQjohDEBNAZnQFzVjoXtB92feb3WRLex98k1jBxGISi9L4eVRrVvJVNlXDgRalhRnKXW6Ch-T2IAcXTrrFTku0XxyyNwlyd73vqqzshZWBbqKywQsqJoBOqgH-vN2PBzfAavQH_72jX9DSDKFHu2Lu9JQAOVLW2KGppQ07gFiMpIWsT-rbJLBFTVu98tg04V4jDddBGrTfzICBpbIiTbOCDqrKpIehojLiZWnFRM2qEMjGIwNqWG4ewd1W-aAJo1FZHuLujBGi3VQB61qMQx5gv5SUHu9ZYM3uZfavcj0hbwgm4NioBlPqpOAImqEfvmd52RIwdTbtyJm99Pa6kTFimkMyEXBRY1w3coy55Pxk1XOaYt-NCjGDYTEKkP5y6j3d_XDTukC9P9XoFf0-WPqHa1gP7up60hTmdwyrHQOW1bgoNiOWnO9K4DoYz-zkF2BA61RqOe3-Lrw-CeMQ
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:26 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame B57A
42 B
112 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssjuqT8_qRRUe5y-g923X0AB103ReOfsM-HBlKnCuBlAuyIG-br77yCpUagWT2NqyCPVSjsMDvHmMykW0UskZuDoneY1FxTnWx_w7V3fQQ&sig=Cg0ArKJSzHhY7Td0qkdUEAE&adk=1727577002&tt=-1&bs=1585%2C1185&mtos=1070,1070,1070,1070,1070&tos=1070,0,0,0,0&p=125,429,215,1157&gcm=1&lcs=1&mcvt=1070&rs=0&ht=0&tfs=109&tls=1179&mc=1&lte=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1583389044515&dlt&rpt=158&isd=0&msd=0&ext&xdi=0&msp=1&ps=1618%2C5252&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-5-11-11-0-0-0&tvt=1176&is=728%2C90&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200304
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:26 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/ Frame 6391
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/209/runner.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
5727
date
Thu, 05 Mar 2020 05:29:56 GMT
expires
Fri, 05 Mar 2021 05:29:56 GMT
last-modified
Tue, 25 Feb 2020 17:32:01 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
2849
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
gen_204
pagead2.googlesyndication.com/pagead/ Frame 6944
0
60 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020022701&jk=4238642583443104&bg=!tLelt69YmpfM0TvJHrUCAAAARlIAAAAOmQFdi7UDYzKhszmmQ7uwedpJ6EkBYNRZTpxViqw18aZg2OsHy59-gEi6kICeZKkWIfB7yvbOZ3_0PbQuTOzciOcdAquhL9V_phEbPa5OVudytt4Aw-ZTWdCj9ZMjdoSbZph3jqTc2PsllWPRecd-BSYjehFvO0rzV9QNHnGZPn5eQ90YWeWphAiSVu3TE1yWqNhr8pXGlLyQ8ioMw-GmhBAM21CqAgH9I7FaCUEwdTvO1ne_dPyFm9ghwvDKp4GtImy03ydS71eLj_4UTckkk7SZCFf-qmQ_Tht1dXUXf7CLcKunvVtgy74LR_q1SnTSLgFOJRSHvcTY_IGxIq3sFU1Mo5cJBziLfd2zvnjyWHzdDVZOGqsMIAMj5mI13WEy9wL8nntwMmRE7olH4eBXNLX1zqIPVuvkAwg06aFJ-7iDyQ100K37i4iLlgR_kqbzjvrU2bG4YdLyZMy6DMynFQ
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:26 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
gen_204
pagead2.googlesyndication.com/pagead/
0
60 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gda_r20200303&jk=4221733706430658&bg=!YmGlYXlYw0oYju2NznECAAAAQlIAAAAPmQFXJ_heyfWcP2IPN-Esq1qBp3Flped-nAfjhof5KHz9kb-lUMoRDA4fm3RZJkZjI4BIlzzgYvzxH9Rq8uMwsOlWyUlR8W-9DNEpL_iN7-FrtDrZYeNmBFRUNp_q4qbsiFm8-L3ThzihhOgZKBCKkrgO6bwrbS02UqPdMh4MVC0Nw5X2lLmUMrxGqdNnbqkClFGmqUAa7J6sqOdq-iDow1TRE7vwGDvibw-QUMIvHevQ7NgMVUZGw6VQ5VDvzrAW18QbQxg4r3zAaFqZOIzq46lfb_DfcjdEu6c130xOanNns_qLXqBEo0vUAJBKj6HwXqXtvtJqau5ZqBHa-Pw_v_DqmYQqrfpHuEJd3D7UtALYqqcnclLWM1YXSuDchqcMOz3-fblT94H8KFgWvd6H7xV2cy5JrrBzjs7f-d3m7ym4syeZP5sS0zbTv3w8QH11Wa94of1KFY8S2g
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:26 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 5912
42 B
112 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsu1bkuUxs-QIo_VSwt52yiGnHa3dnyOYyFto5C5kgHF8iTbAqeurPIz8zDYZLeqPrjL4-e-z6uWu6WSZbSVLODLebYeWFyXDSmYi9-CujM&sig=Cg0ArKJSzLvDt2ymquwmEAE&adk=2778923653&tt=-1&bs=1585%2C1185&mtos=0,1036,1036,1036,1036&tos=0,1036,0,0,0&p=125,1318,725,1618&gcm=1&lcs=1&mcvt=1036&rs=0&ht=0&tfs=104&tls=1140&mc=0.89&lte=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1583389044703&dlt&rpt=94&isd=0&msd=0&ext&xdi=0&msp=1&ps=1618%2C5252&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-3-11-11-0-0-0&tvt=1139&is=300%2C600&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200304
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:26 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 6944
42 B
112 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstSCxMMNAZSzm6AfhOL1g1d54vVA2L0WTVM2qkloItjQviJTNo_0OcsWXaWCS9bBdH059Jv9bunV5v8t4AAABb2658Ey82KO8PsA_-TY80&sig=Cg0ArKJSzDwNAiO24_ewEAE&adk=1428895410&tt=-1&bs=1585%2C1185&mtos=1016,1016,1016,1016,1016&tos=1016,0,0,0,0&p=282,968,532,1268&gcm=1&lcs=1&mcvt=1016&rs=0&ht=0&tfs=103&tls=1119&mc=1&lte=0&bas=0&bac=0&met=mue&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1583389044903&dlt&rpt=118&isd=0&msd=0&ext&xdi=0&msp=1&ps=1618%2C5252&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-2-11-11-0-0-0&tvt=1118&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200304
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

pragma
no-cache
date
Thu, 05 Mar 2020 06:17:26 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
content14_10_18m.js
vidstat.taboola.com/
37 KB
8 KB
Script
General
Full URL
https://vidstat.taboola.com/content14_10_18m.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/27_4_4/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:26 GMT
via
1.1 e0064d0a2437e206ed082e1fa1cdae61.cloudfront.net (CloudFront), 1.1 varnish
age
2591083
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
7638
x-served-by
cache-hhn4022-HHN
last-modified
Sun, 14 Oct 2018 13:31:31 GMT
server
AmazonS3
x-timer
S1583389046.302495,VS0,VE0
etag
"d8d81221ec6e604811ce469d899c9c8b"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
x-amz-cf-id
omj5vaGwuVO0u1DUElZ04p0xjblvLHfKzDESlIUndnM3CZOy52LCcg==
x-cache-hits
284657
oppsula.js
vidstat.taboola.com/oppsula/1.3.7/
15 KB
5 KB
Script
General
Full URL
https://vidstat.taboola.com/oppsula/1.3.7/oppsula.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/27_4_4/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
156bbc6074bd716cfd120c1a82cf3ac0843514645445668ea9f251779388f7a8

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:26 GMT
via
1.1 61adf71a363fe0f836dc69dbb43de824.cloudfront.net (CloudFront), 1.1 varnish
age
2559081
x-cache
Miss from cloudfront, HIT
status
200
content-encoding
gzip
content-length
5160
x-served-by
cache-hhn4022-HHN
last-modified
Tue, 04 Feb 2020 15:12:26 GMT
server
AmazonS3
x-timer
S1583389046.312715,VS0,VE0
etag
"eeb09b70ec2c853834052219c0755e10"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
x-amz-cf-id
jllceAguc4gy2HXyK4x2CLbtzWNsnWfhls-MGCfv5pyTB6mQ2aqNVA==
x-cache-hits
283139
OvaMediaPlayer.js
vidstat.taboola.com/vpaid/vPlayer/player/v11.0.4/
545 KB
140 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v11.0.4/OvaMediaPlayer.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/27_4_4/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
ae5f21e113860e52608234c29162ab9c8666e872c5268e79a6b20a5087c75aa9

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:26 GMT
via
1.1 009e5e3e32afcd1d135a7234c9da5521.cloudfront.net (CloudFront), 1.1 varnish
age
321802
x-cache
Miss from cloudfront, HIT
status
200
x-amz-meta-mode
33188
x-cache-hits
356189
content-encoding
gzip
content-length
143165
x-served-by
cache-hhn4022-HHN
last-modified
Sun, 01 Mar 2020 06:41:22 GMT
server
AmazonS3
x-timer
S1583389046.325575,VS0,VE0
etag
"0050ad161bd158adbfedb787f6800c05"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
cfMh_dovGcf1gsXLKcBu_VyeJUzgAo6f8oAJ7jNHOh_UMWokcb2NQQ==
x-amz-meta-mtime
1583044880
sync
match.taboola.com/ Frame 2683
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7TMMCFgMUnIS00PDt0AQUnIS00PDt0AUAAAAGBvQHGzncrUik0W7Em2yWo8ViM1zOlsPVcjabDGEjh7sViTTajXiTzXK0WGx2s-FyN5wtZpsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABQcCisy2W5uCw_l90fAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiUWMAAAAAKTMJgyPJnVCZVEFAECQbgVwBQAQAJd69VYZBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhJgMuNOAKL9J1X4BAQDWfgEBANjUDQDgTQAu6AJgdQYx2Yx2k9kBAAAA3P3____rgZRrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRovtvZr7kH1FgVz3jQjL7PcdFJTT02N2GWQsl8mgFsiaJpffID5oGJaTQTC_CVuMVpPJZjmcLReTwXA0HI32J3CjAU7QcDhY7AaL3WIxnCwmo8FysECBGExwQoajzWQ12q12k-VwMhrNNpMNUrRqNRttBsPVbDLb7VbDwXA5GiFFaxazyWQxGy13m8FyMhoMJ8MhwshwNRvtBpu1xOIZuUUT22itsK1MbsloM5r4FpPZbuJyi14f02u1cKxspik-1Oni2NcuDNXp49jXTlwUDCDbi-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-5ZrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRot9ZbiajXaDzVpi8YzcoolttFbYVia3ZLQZTXyLyWw3cblFr4_ptVo4VjbTvrEabjbD5WA02jdWw81muByMRvsOneG7-pyNyptW4dFJzc7G8SUzHRQug8W7Ua2O48_kIC2bjU6dMnEsaox-v9_v9_v9fr_fb9B6DmaDwnctS5V_w-7m3GZfB6MilghOF-lE9DKeLmKJ5GmRTlQW02rmW1l8E4vF4jKOFiaTc7kbTQaTzcy1Wi4sYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HBpzMFYPJXLGcKzajVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HmQM!&excid=22&docw=0&cijs=1
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/27_4_4/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, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
match.taboola.com
:scheme
https
:path
/sync?dast=V7TMMCFgMUnIS00PDt0AQUnIS00PDt0AUAAAAGBvQHGzncrUik0W7Em2yWo8ViM1zOlsPVcjabDGEjh7sViTTajXiTzXK0WGx2s-FyN5wtZpsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABQcCisy2W5uCw_l90fAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiUWMAAAAAKTMJgyPJnVCZVEFAECQbgVwBQAQAJd69VYZBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhJgMuNOAKL9J1X4BAQDWfgEBANjUDQDgTQAu6AJgdQYx2Yx2k9kBAAAA3P3____rgZRrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRovtvZr7kH1FgVz3jQjL7PcdFJTT02N2GWQsl8mgFsiaJpffID5oGJaTQTC_CVuMVpPJZjmcLReTwXA0HI32J3CjAU7QcDhY7AaL3WIxnCwmo8FysECBGExwQoajzWQ12q12k-VwMhrNNpMNUrRqNRttBsPVbDLb7VbDwXA5GiFFaxazyWQxGy13m8FyMhoMJ8MhwshwNRvtBpu1xOIZuUUT22itsK1MbsloM5r4FpPZbuJyi14f02u1cKxspik-1Oni2NcuDNXp49jXTlwUDCDbi-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-5ZrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRot9ZbiajXaDzVpi8YzcoolttFbYVia3ZLQZTXyLyWw3cblFr4_ptVo4VjbTvrEabjbD5WA02jdWw81muByMRvsOneG7-pyNyptW4dFJzc7G8SUzHRQug8W7Ua2O48_kIC2bjU6dMnEsaox-v9_v9_v9fr_fb9B6DmaDwnctS5V_w-7m3GZfB6MilghOF-lE9DKeLmKJ5GmRTlQW02rmW1l8E4vF4jKOFiaTc7kbTQaTzcy1Wi4sYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HBpzMFYPJXLGcKzajVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HmQM!&excid=22&docw=0&cijs=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
t_gid=9e1f3fcb-9c06-40ed-945a-826e9d29d4d5-tuct55a1ef5
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx
content-type
text/html;charset=ISO-8859-1
machineid
3401
accept-ranges
bytes
date
Thu, 05 Mar 2020 06:17:26 GMT
via
1.1 varnish
x-served-by
cache-hhn4067-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1583389046.324730,VS0,VE9
st
convammp.taboola.com/
0
53 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7TMMCFgMUnIS00PDt0AQUnIS00PDt0AUAAAAGBvQHGzncrUik0W7Em2yWo8ViM1zOlsPVcjabDGEjh7sViTTajXiTzXK0WGx2s-FyN5wtZpsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABQcCisy2W5uCw_l90fAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiUWMAAAAAKTMJgyPJnVCZVEFAECQbgVwBQAQAJd69VYZBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhJgMuNOAKL9J1X4BAQDWfgEBANjUDQDgTQAu6AJgdQYx2Yx2k9kBAAAA3P3____rgZRrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRovtvZr7kH1FgVz3jQjL7PcdFJTT02N2GWQsl8mgFsiaJpffID5oGJaTQTC_CVuMVpPJZjmcLReTwXA0HI32J3CjAU7QcDhY7AaL3WIxnCwmo8FysECBGExwQoajzWQ12q12k-VwMhrNNpMNUrRqNRttBsPVbDLb7VbDwXA5GiFFaxazyWQxGy13m8FyMhoMJ8MhwshwNRvtBpu1xOIZuUUT22itsK1MbsloM5r4FpPZbuJyi14f02u1cKxspik-1Oni2NcuDNXp49jXTlwUDCDbi-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-5ZrMHEuJpvBYORyLUce43BmW24cxtVqMpjZRot9ZbiajXaDzVpi8YzcoolttFbYVia3ZLQZTXyLyWw3cblFr4_ptVo4VjbTvrEabjbD5WA02jdWw81muByMRvsOneG7-pyNyptW4dFJzc7G8SUzHRQug8W7Ua2O48_kIC2bjU6dMnEsaox-v9_v9_v9fr_fb9B6DmaDwnctS5V_w-7m3GZfB6MilghOF-lE9DKeLmKJ5GmRTlQW02rmW1l8E4vF4jKOFiaTc7kbTQaTzcy1Wi4sYonSdJFO9LqXxWE4fP6Ch_PwMPtFT8Ph8xc8nIeH2S32-5x2t-bv1rmMps9bdTe5NX-32O_ynN5Ko-Ut9vucdrfg8reYXW6XRf3HBpzMFYPJXLGcKzajVQIAAAAAAAAAWMKceRMAAACA00AWi8FksVwACDHWXYJPqZBHJ_C34saPIeZ0-btclrfmbXHrnD6HmQM!&cmcv=&pix=31589837&cb=1583389046287&uv=2744&tms=1583389046287&abt=affp_vB!expl_vB!ftp1_vB!nopps_vB!t45!ufm_vA!utb11_vB!utc12_vD&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1583389043198.738!ts:1583389046287&
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

date
Thu, 05 Mar 2020 06:17:26 GMT
via
1.1 varnish
server
nginx
x-timer
S1583389046.361699,VS0,VE8
x-served-by
cache-hhn4067-HHN
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0
d876130f-3b10-4e4d-bc09-9bc5afe4421c
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/d876130f-3b10-4e4d-bc09-9bc5afe4421c
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

Request headers

Sec-Fetch-Dest
video
Accept-Encoding
identity;q=1, *;q=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Range
bytes=0-

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
4078447b-a242-4cc2-83ee-3c8cf8774130
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/4078447b-a242-4cc2-83ee-3c8cf8774130
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

Request headers

Sec-Fetch-Dest
video
Accept-Encoding
identity;q=1, *;q=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Range
bytes=0-

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
5302344717
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5302344717
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
52.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:26 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5302344717
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
monitoring.js
acdn.prod.pubstack.io/
61 KB
19 KB
XHR
General
Full URL
https://acdn.prod.pubstack.io/monitoring.js
Requested by
Host: boot.pubstack.io
URL: https://boot.pubstack.io/v1/tag/f9b17833-d68c-4e4d-b319-d6061d45aa9f
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2620:1ec:bdf::10 , United States, ASN8068 (MICROSOFT-CORP-MSN-AS-BLOCK, US),
Reverse DNS
Software
Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 /
Resource Hash
b194e718570b321359cdb523a5ed73b7c396150aaffdc5fece2a3e7659c12605

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-ms-blob-type
BlockBlob
date
Thu, 05 Mar 2020 06:17:26 GMT
content-encoding
br
x-azure-ref-originshield
0E49gXgAAAADwxUFvSwQmTppNd0eZOqLQQU1TRURHRTA2MTEAMWQ5ZWE5NzctYWI2Ny00N2M3LTkzYTUtMzIzYzA3MDkwMTQy
content-md5
UzyJB/BhpVSBGTVPrGrz9g==
x-cache
TCP_HIT
status
200
x-ms-lease-state
available
x-ms-lease-status
unlocked
last-modified
Wed, 11 Dec 2019 09:47:01 GMT
server
Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
etag
"0x8D77E1F12B2C8B0"
x-azure-ref
0dplgXgAAAABgl+9t9ARbQa5cOXNHtY13RlJBRURHRTEwMDkAMWQ5ZWE5NzctYWI2Ny00N2M3LTkzYTUtMzIzYzA3MDkwMTQy
content-type
application/javascript
access-control-allow-origin
*
x-ms-request-id
44553c9a-601e-013c-1aa9-f2c458000000
cache-control
public, max-age=3600
x-ms-version
2014-02-14
accept-ranges
bytes
map
ih.adscale.de/ Frame 9944
Redirect Chain
  • https://ih.adscale.de/map?ssl=1&format=video
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=03d0ed3eec424d81bd16e3fafbaa79a9
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=03d0ed3eec424d81bd16e3fafbaa79a9
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.185.150.7 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-185-150-7.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

:method
GET
:authority
ih.adscale.de
:scheme
https
:path
/map?ssl=1&format=video&nut&uu=03d0ed3eec424d81bd16e3fafbaa79a9
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
uu=03d0ed3eec424d81bd16e3fafbaa79a9
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
date
Thu, 05 Mar 2020 06:17:26 GMT
content-type
text/html;charset=ISO-8859-1
content-length
2214
server
Apache-Coyote/1.1
set-cookie
tu=4#1160306229#101~~439830~439830~1#38~~439830~439830~1#72~~439830~439830~1#42~~439830~439830~1#75~~439830~439830~1#60~~439830~439830~1#108~~439830~439830~1#63~~439830~439830~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None

Redirect headers

status
302
date
Thu, 05 Mar 2020 06:17:26 GMT
content-length
0
location
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=03d0ed3eec424d81bd16e3fafbaa79a9
server
Apache-Coyote/1.1
set-cookie
uu=03d0ed3eec424d81bd16e3fafbaa79a9; Domain=.adscale.de; Expires=Tue, 02-Mar-2021 22:44:06 GMT; Path=/
error
intake.prod.pubstack.io/v1/intake/
0
178 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/error?sId=b090ce7b&c=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
108.128.27.24 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-108-128-27-24.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Access-Control-Request-Method
POST
Origin
https://www.giga.de
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Access-Control-Request-Headers
content-type

Response headers

status
204
date
Thu, 05 Mar 2020 06:17:27 GMT
access-control-allow-origin
*
access-control-allow-headers
Origin,Content-Length,Content-Type
access-control-max-age
43200
access-control-allow-methods
GET,POST,PUT,PATCH,DELETE,HEAD
auction
intake.prod.pubstack.io/v1/intake/
0
178 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/auction?sId=b090ce7b&c=3
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
108.128.27.24 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-108-128-27-24.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Access-Control-Request-Method
POST
Origin
https://www.giga.de
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Access-Control-Request-Headers
content-type

Response headers

status
204
date
Thu, 05 Mar 2020 06:17:27 GMT
access-control-allow-origin
*
access-control-allow-headers
Origin,Content-Length,Content-Type
access-control-max-age
43200
access-control-allow-methods
GET,POST,PUT,PATCH,DELETE,HEAD
error
intake.prod.pubstack.io/v1/intake/
0
57 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/error?sId=b090ce7b&c=1
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
108.128.27.24 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-108-128-27-24.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Thu, 05 Mar 2020 06:17:27 GMT
auction
intake.prod.pubstack.io/v1/intake/
0
57 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/auction?sId=b090ce7b&c=3
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
108.128.27.24 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-108-128-27-24.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Thu, 05 Mar 2020 06:17:27 GMT
5303510597
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5303510597
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
52.57.208.4 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-57-208-4.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 05 Mar 2020 06:17:27 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5303510597
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
p.min.js
cdn.emetriq.de/adp/profiling/0.2.25/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.25/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/69511/default.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2156:4200:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
fda97ec20907646eef81309463a8f352dd07cb189eabb717c66fc1757c8c6f3f

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Fri, 21 Feb 2020 07:46:10 GMT
content-encoding
gzip
last-modified
Fri, 21 Feb 2020 07:34:56 GMT
server
AmazonS3
age
1117879
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
5FyQWcxtGpTx80dn9lJhhCWeIQOZ27ta
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
FRA50-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
XotZymz1o0VsRlL0iNDq4iVIIUDfeKG0zy3rFCVLgBDn1S4NRQgzNg==
via
1.1 1d87c34bb2f20fda8e0841bc33179769.cloudfront.net (CloudFront)
/
d.agkn.com/iframe/8613/ Frame 36D0
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=756780735&gdpr=&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%22%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:2156:8a00:19:fc2c:a140:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

:method
GET
:authority
d.agkn.com
:scheme
https
:path
/iframe/8613/?che=756780735&gdpr=&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%22%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
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
content-type
text/html;charset=UTF-8
content-length
481
cache-control
no-cache, must-revalidate
date
Thu, 05 Mar 2020 06:17:28 GMT
expires
Sat, 01 Jan 2000 00:00:00 GMT
p3p
CP="NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
pragma
no-cache
server
Apache-Coyote/1.1
set-cookie
ab=0001%3ARN68PXGm1iF7pdL7U5KF%2FV9bOKbjJ6a7;Path=/;Domain=agkn.com;Max-Age=31536000;SameSite=None;Secure u=C|0AEAl81X4JfNV-AAAAAAAAg1RAQCADVIBAIA;Path=/;Domain=agkn.com;Max-Age=31536000;SameSite=None;Secure
x-cache
Miss from cloudfront
via
1.1 fb8c0300277bd0137c1693d3d64ab550.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA50-C1
x-amz-cf-id
eTxGgccxre5VEGh6P-UWLVVewZXQR0_pjMbvBdpdzc5OJ4HGtxSlrg==
data
ups.xplosion.de/
3 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=886c72288fc395da52cf164886d37815&event_id=page_view&_sid=69511&_ver=0.2.25&_seg=jsonp&_=737731189906
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.25/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.76.119.33 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-76-119-33.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
00e55928cc2411c7cd9b0bf3995a8d03c14b72d554e2243ea9cd2a2123c03fb4

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

date
Thu, 05 Mar 2020 06:17:28 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
status
200
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
data
lb46.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb46.s400.meetrics.net/data?/K06kIJOBALl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A4zAz4A5wA0zAx5A4qEt1B6zFu3Bi0F4BFUkzFFCPWKAAAAAAABAjuAPBAAFAAAjuTTfPAPAAAJPAaEABTfPAZAAAOA55A55A85B55A58E55A55AGAx5Aw2A12ArTfPAPCCAAZAwSAcAAAAP0BAJPAaEAHTfPAPAAAsEA6DAMTfPASksFeFjAAAAAAAAAAAAEAAAAjuAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFFAz0A4zBxBEMAxzA4zAwzA0xA23A3xAGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA1zAwzA1xAw1A53AJAylFj0FhuFnsFlBFKA1zAwzA1xAw1A53AKA1zAwzA1xAw1A53AzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAaEAiAAfAAFAAATfPAAAAAPA4tB1uFruFv3FutBz0A4zBxBEAAAAAAAAAAAAAAAAQtjF+wlATA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.132 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h224.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:28 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Thu, 05-Mar-20 06:17:27 GMT
adrtxtag.min.js
cdn.adrtx.net/
840 B
849 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.154.128.203 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-154-128-203.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
script

Response headers

Date
Wed, 04 Mar 2020 12:26:54 GMT
Content-Encoding
gzip
Last-Modified
Mon, 24 Feb 2020 18:02:24 GMT
Server
akka-http/10.1.11
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
activation
adstax-match.adrtx.net/ Frame 2523
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.252.24.237 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-34-252-24-237.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Thu, 05 Mar 2020 06:17:35 GMT
P3P
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server
akka-http/10.1.11
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1583389053886&__it=-60&__ic=727391&__iq=ebe1747b80ed5166ae77b1018b0ac49f&__ig=1
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

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
image

Response headers

Pragma
no-cache
Date
Thu, 05 Mar 2020 06:17:34 GMT
Last-Modified
Fri, 26 Feb 2010 06:15:28 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Thu, 28 Feb 2013 06:15:28 GMT

Failed requests

These URLs were requested, but there was no response received. You will also see them in the list above.

Domain
bh.contextweb.com
URL
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%%

Verdicts & Comments Add Verdict or Comment

349 JavaScript Global Variables

These are the non-standard "global" variables defined on the window object. These can be helpful in identifying possible client-side frameworks and code.

object| onformdata object| onpointerrawupdate string| cookieName function| getCookie function| setCookie object| smbContext object| LUX object| POST_META object| smbt object| smbadloader string| GoogleAnalyticsObject function| ga function| adLoader object| apstag object| _m6rq object| smbDmpTracking object| dimensions object| dimension10 string| GIGA_AREA string| WP_SITEURL string| SHUTTLE_CORE_VIDEO_CDN_VIDEO_URL string| SHUTTLE_API_URL string| VIDEO_INLINE_MODE boolean| VIDEO_AUTOPLAY_DISABLED boolean| smbt_only function| requirejs function| require function| define object| DKUIM_SETTINGS object| is number| LUX_t_start number| LUX_t_end object| gaLog string| szmvars object| iom object| smbVideoService string| lazyLoadAmdUrl string| polyfillAmdUrl object| dependencies object| _absconfig object| pagespeed object| iam_data object| adsbygoogle object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| google_js_reporting_queue number| google_srt object| google_ad_modifications object| google_logging_queue object| ggeac boolean| google_measure_js_timing object| googleToken object| googleIMState function| processGoogleToken object| google_reactive_ads_global_state boolean| _gfp_a_ object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad boolean| _gfp_p_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars object| btnRightSide object| widgets object| oldBtn2 object| preventDefaultTitle object| preventDefaultImg function| preventDefaultClick function| _extends function| _typeof string| type function| sdibgclick object| _ecoconf object| _tfa object| _tscrtlog object| Criteo function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam function| _ function| setImmediate function| clearImmediate boolean| apstagLOADED object| nativendo_588f272a3e49c_conf function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator number| __google_ad_urls_id object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired object| TFASC object| TRC object| _taboola number| taboola_view_id object| TRCImpl function| __trcError function| __trcJSONify object| criteo_pubtag function| $ function| jQuery function| isEmpty function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| NativendoV2 object| NativendoV2Loader object| nativendo object| nativendo_588f272a3e49c number| _m6rApiLoaded object| _econa function| send function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb object| closure_memoize_cache_ object| YLHH object| yieldlove_site_settings object| yieldlove_cmd object| core function| pbjsYLHHChunk function| checkOmid3pExist object| de_meetrics undefined| list object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad string| preloadType function| SDG_CookieLayer object| _tblConsole undefined| msg object| _comscore object| _m6rOnce number| _m6rContainerLoaded function| webpackJsonpdkuim object| Base64 boolean| dkuimInited object| stroeerCore object| confiant function| udm_ object| ns_p object| COMSCORE string| sdm_ift function| __trcCopyProps function| __trcFromError function| __trcClientTimestamp function| __trcLog function| __trcDebug function| __trcInfo function| __trcWarn function| __trcDOMWalker function| __trcPurgeEventHandlers function| __trcUnJSONify function| __trcGetMargins function| __trcAttachResize function| __trcDetachResize function| __trcTrim function| __trcGetElementsByClass function| __trcToArray function| __trcObjectCreate function| PageManager function| addHashParam function| _calculateEventsLength function| _countDOMNodes function| _countNetworkCalls function| _calculateFPS function| _trackVideoLoadLength function| _trackTimeToFirstUnitElement function| _trackTimeToDisplayImpression function| _trackTimeToPlayerCreation function| _hookToSrcProperty function| _trackTimeToFirstWaterfall number| trc_debug_level string| trc_article_id object| nativendo_588f272a3e49c_map object| trcManager object| trcRbox object| options function| _createClass function| _classCallCheck string| MODIFY_FV_RETURN_POSITION_HOOK_NAME string| DEFAULT_VARIANT function| ModifyFVReturnPosition object| cmTag object| cp2 object| GoogleGcLKhOms function| setUpAgknTag function| startCMTagMain object| google_image_requests string| category function| shuffle object| arrToUse object| travel object| news object| mobilecontent1 object| mobilecontent1_new object| travelmuted object| movietrailersHD object| movietrailersHDmuted object| widescreen object| movietrailerslight object| landscapeHD object| landscapeHDmuted object| blank object| blankblack object| blankblack7 object| blankblack5 object| blankblack_mob object| blankwhiteHDmpg object| blankblack10 object| blankwhite object| blankwhiteHD object| black_loader object| lightweight object| lightweight_single object| lightweight300600 object| bonnier object| home object| lipstick object| shoes object| art object| infiltrator object| glass object| lemurs object| NBAshoes object| Sunglasses object| Hummus object| Short_food object| Short_swim object| Euro_news object| Automoto_TV object| Uzoo object| SmartDuvet object| Tiger object| Chocolate object| Logan object| Jacket object| Bike object| Kanye object| Cancun object| Smartwatch object| Helicopter object| dogshampoo object| icetea object| charger object| blueysmoothie object| ShortContent object| carbsandwich object| pisatower object| Food1 object| Food2 object| Food3 object| Food4 object| Food5 object| Food6 object| Food7 object| Fashion object| Lifestyle1 object| Lifestyle2 object| Technology1 object| Technology2 object| Technology3 object| Entertainment object| Scrambledeggs object| Spinach object| Bub1 object| Pokemon object| style_hacks object| Motorcycle object| IceCracking object| Manatees object| Daiving object| Fishing_Lure object| Shark object| HundredsManatees object| TigerShark object| MandelaPrize object| Bertram35 object| bushfire object| Snow object| Delta object| Wheels object| Yellowfin object| Grip object| Kawasaki object| Yoga object| Cat object| Chickens object| RZR object| bitcoin object| bmw object| wombat object| koala object| Marsupial object| puppy object| bitcoinMuted object| bmwMuted object| Wallabies object| Bunny object| Pumpkins object| Dogs_Stress object| Dogs_Stress_image object| lightweight300600_short object| playlist function| webpackHotUpdate string| vpaidId function| OvaMediaPlayer object| Adform object| pbstck function| _h object| _adexc object| adex object| _EQLService object| _EQPScript function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet object| _EQPService object| _adrtx string| segments object| segmentsArr undefined| result string| _emqstr

2 Cookies

Domain/Path Name / Value
.taboola.com/ Name: t_gid
Value: 9e1f3fcb-9c06-40ed-945a-826e9d29d4d5-tuct55a1ef5
.doubleclick.net/ Name: IDE
Value: AHWqTUn9UN7KxMhCr88qTzxWIBg80AEXXjQGMuEPWayNS61--hGJxil9SH5c9_Mg

4 Console Messages

Source Level URL
Text
console-api log URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
starting version 20181002
console-api log URL: https://cdn.taboola.com/libtrc/unip/1092206/tfa.js(Line 3)
Message:
Taboola Pixel: An error occurred while handling command '{"notify":"event","name":"page_view","item-url":"https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/","tim":1583389043806}'. TypeError: Cannot read property 'getItem' of null
console-api info URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
got title from meta
console-api error (Line 1)
Message:
Pubstack.io // [object Object]

Indicators

This is a term in the security industry to describe indicators such as IPs, Domains, Hashes, etc. This does not imply that any of these indicate malicious activity.

15.taboola.com
aax-eu.amazon-adsystem.com
acdn.prod.pubstack.io
ad.yieldlab.net
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
ajax.googleapis.com
ams.creativecdn.com
api.yieldlove-ad-serving.net
bbcdn-bbnaut.ibillboard.com
bh.contextweb.com
boot.pubstack.io
bttrack.com
c.amazon-adsystem.com
c.nativendo.de
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.emetriq.de
cdn.m6r.eu
cdn.speedcurve.com
cdn.stroeerdigitalgroup.de
cdn.stroeerdigitalmedia.de
cdn.taboola.com
cdnjs.cloudflare.com
cds.taboola.com
cm.g.doubleclick.net
confiant-integrations.global.ssl.fastly.net
convammp.taboola.com
creativecdn.com
d.agkn.com
d.nativendo.de
de-gmtdmp.mookie1.com
de.ioam.de
dkuim.de
dmp.theadex.com
files.giga-video.de
go.giga-abs.de
gocp.stroeermediabrands.de
googleads.g.doubleclick.net
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
imprammp.taboola.com
intake.prod.pubstack.io
irqs.ioam.de
js.adscale.de
js.agkn.com
js.stroeermediabrands.de
lb46.s400.meetrics.net
match.adsrvr.org
match.taboola.com
match.zorosrv.com
maxcdn.bootstrapcdn.com
nugmw.userreport.com
pagead2.googlesyndication.com
pixel.rubiconproject.com
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
px.adhigh.net
px.powerlinks.com
quiz.stroeermediabrands.de
rtb.mfadsrvr.com
s3.eu-central-1.amazonaws.com
s400.mxcdn.net
sb.scorecardresearch.com
script.ioam.de
securepubads.g.doubleclick.net
server.exposebox.com
si.nuggad.net
ssl-econa.met.vgwort.de
ssl.1.damoh.giga.de
ssl.2.damoh.giga.de
static.criteo.net
static.giga.de
sync.mathtag.com
t.nativendo.de
tpc.googlesyndication.com
track.adform.net
tracking.m6r.eu
trc.taboola.com
ups.xplosion.de
videos.giga.de
vidstat.taboola.com
www.dunkirkinception.com
www.facebook.com
www.giga.de
www.google-analytics.com
www.googletagservices.com
www.gstatic.com
www.storygize.net
x.bidswitch.net
bh.contextweb.com
107.178.241.34
108.128.27.24
109.71.25.30
13.224.194.92
136.243.3.132
136.243.75.34
141.226.224.32
143.204.101.32
143.204.90.242
144.76.9.6
151.101.114.2
151.101.114.49
151.101.13.194
151.101.14.2
151.101.14.217
151.101.14.49
161.156.66.178
172.217.22.98
172.217.23.130
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
18.185.150.7
18.194.102.89
18.196.121.150
185.184.8.30
185.29.135.234
185.33.223.209
188.40.16.106
192.132.33.46
193.46.63.75
194.213.222.30
2.16.122.151
2.19.33.59
2001:4de0:ac19::1:b:1a
23.210.248.245
23.43.115.95
2600:9000:20eb:c000:15:efbc:e300:93a1
2600:9000:2156:4200:1c:8c89:a300:93a1
2600:9000:2156:8a00:19:fc2c:a140:93a1
2600:9000:21f3:7a00:12:6213:9cc0:93a1
2600:9000:21f3:f600:1f:a1b:34c0:93a1
2606:4700:20::681a:5fb
2606:4700::6811:4104
2620:1ec:bdf::10
2a00:1450:4001:800::2003
2a00:1450:4001:806::200a
2a00:1450:4001:809::2002
2a00:1450:4001:809::200a
2a00:1450:4001:814::2002
2a00:1450:4001:818::2002
2a00:1450:4001:819::2001
2a00:1450:4001:81a::200e
2a02:2638::3
2a02:26f0:eb:181::5f76
2a03:2880:f12d:83:face:b00c:0:25de
3.124.69.248
34.252.24.237
35.156.162.45
35.162.160.88
35.186.238.175
35.201.85.158
37.157.6.241
40.113.136.100
46.253.113.178
46.253.113.181
5.9.139.135
52.19.114.209
52.219.74.159
52.57.208.4
52.94.216.48
54.154.128.203
54.76.119.33
69.173.144.139
89.163.159.103
91.215.100.39
91.215.103.65
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
00e55928cc2411c7cd9b0bf3995a8d03c14b72d554e2243ea9cd2a2123c03fb4
0320996ae95e773b6cebfbeac056dd5b42c05557643373ae8309815ccfe766f7
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
099ae698b2292d7ec4a45c32230ac80d194d9d8cebebd634f38a2e132535d209
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
156bbc6074bd716cfd120c1a82cf3ac0843514645445668ea9f251779388f7a8
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
2519693c1aeb9c0476271315b9f0e12464ff8fe89c525f04f4cb5f40b3c9c5e2
2885890775cd2a2c76ba604b21c181017ad25dfc4a32b75c2fa1839b9568bd1f
2b538c1122ab6422830bb4050ea1354d05beeafe073a808b0a9ac1a3d458b37e
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
2cc04669e3c40fc1d94503f771236e704d0d01e44da3bd95795f7c140a0a1144
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
31eef561438773aa8905d73dfe2e8400eca13620146d6235c6e019a828bd33fe
31f25dee720c1cc57694de1ed117f8a5b34c0899c453223cde12bbcab7518416
3359748fa01c9e7f2a97c2cf1acd9b157995e7b8e11569ac083d767ade4e3078
3786b76d0a2f48f6cf804db8b9779095c2b97d335f7000863b9d19a1d46a2d62
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618
3b142ebd13e469a013283908b7b1ea8c24126fcc1e1e94d6a7fc57efcd8d3ff8
42dceddea84c6aa9734bbcc38522bbcbe3eb3f93eea6ac3fec86ae29323443dd
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
4532f79dd4221b45bb4f0008abce433420eeb875e88a9ea119063b90adbb6cb5
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
5318e6f99439de8be22212f030c069a25e38feb81952f4fed93121eed1aef3b4
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
553b7035c4df88b88b8903f629f83710ec504f6ed8bb06034be2e68383a149da
55ba1afca9b98725818e30608b01c51bbe71a4f5580cf5aa45932fc95271cdd7
5a0b050607d03061476a57618facae88282b14052416e63e7222fed31fc26a5d
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
60102f26830f95c37963a8ab7609098e932d2b6915cc9396ee9c585fda650296
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda
6416f0b75099e189728351765dc9b86da8d6456aa5f8d5f4176aac99dbe36eef
655fe20a2239e6d0a41bae033831dd52a3b116da58c1a660377b1660d6e51e10
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
6961765a4f1a44837db3a12530e74a1acd03ef3e70366f0be03b9e7e2d650d0e
69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
7036c5cd37e467a149892d8d26d5ffc2c5b6724b779f76c79cb65e466ac25a7a
72079e05e49316d0245e16904460e88a8001bfd320327e1de68dac8d12a89114
7350b2da3a9331eab4f610761a72e897f2cb4a7e459eb46d8d0238cb55466ccd
74d3720dcf1dbf863d5810d6961bfdb3b13ba6f269a2c8f5627f054b6124e676
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
7cf9398d48d182ac1ad5a4c1199ca08e9431b984220b624580a16125017aa085
7e7eeed9bbaf12534f8daf84968ea468d995221e958545e42f4afa6626afdef6
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
84950de4629ee3908d2e8df1fa183ea51d00e741f6910559d764f810a2b4555b
867fcdee994f97b16fef41ae32d08824c740548971a14308fb80a60dd30c8694
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
870acd964c14c5e6e4b24de8d61c926b924d69f88a540430234e8a90783ab4fb
88b230f7cc8dcdf4ac2d71c5537f063d2be6b51ecf10df6ba04bb53a0062b9f2
88fc085c6a5f93725f2e1c4cc4180fb1a6b7666a92ed36230e7dc613a39128cc
8b81c098f8cd1362848b2d9b10a139bbf07ed1aa0411712c7d502d31a1734506
8bb09124900f5a4358b9d696d5723f9c495bc5e0d0966b2a097efc2f575c8947
8beb904f67cc6daaa4d6d22518152461f640b003b4accab3b705bb2cb92e8230
8db3daba71f655f21d2c31ce0a75b09e27e339241b2acd3637580db9a9eb2120
8f0aedeb149fe3b5bf923f3555963bf08ddf19aa1b484491e7119b3ab531c4d7
8f22ebb48904dc39955840ec9dc81566a490b33f06367760e989f345abb62b85
8fca25bdf045cb013a9259ae9ad78676cb3384b0c70d6468172b91b85ed4e678
923d64598979239fdb6ca32f8965b8de89cc12826e0db7de011889f17d89fb08
94ee2b6f661c7f0859d383dc0ee7d8a6abd81ae9b1db4c74a19a03360782fbea
95ebbe3b755f0749ef26c07fe339baacce6266f4792e0d4cd684d064fa40b2cf
962199fa51e71cd864286410a6b10c2596120c0ec8822abbedb66646e7f021a5
9694d72e65a5b488a1e18d166970ab73de4848e18766fee7634d803cef4cc8f7
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
984b50b44ade35d903bbfa50129e85a46a2247060ae69b55e7e595fd1f7dadde
993b9c17cd76897fc81ff978ff0b7b7272567897cf7ddd1f26d20e778f1c70e7
9d66c3c06c07f63e93d64db5ada1034094f71ab1bcfc6d0d7d6034d78aeda881
9e246664e309610d36fae107ce8d51f81c4cc10c74a233c5b845e55a2eb819f3
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a256529bd5b1b8846f8d2536ce7581fb6cea4479992f222d01535903dff48d79
a3979658fb395398dd2d3d9da7608c6c1a36a68dcf330d22a1e6ec4c29a3c1e4
a41b082a5add3cc5754af976d70900d246a3569441d546dfe86a8b6f9f19ae6a
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
a56833ce8542a71a519392f11f8351575830bd5ab43ff6ea30bbcb79dbbf2844
a7019b73cbcf928d42e36f0588c8748254ef15b914690083d80a629943267dcd
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9
ac2a58f9d55c4642121cfb6f7e213cbc882bbdd75ef171ca8a07ed982ef693ce
aca982026b8eab4d724bf9171dce5d2d5ca0f8a40c695fa2e60069ae7a66a12e
acde06ad362c121d053a5a93e0a7ab367d62f3f929045dd909bfe64a1c7179b1
ae5f21e113860e52608234c29162ab9c8666e872c5268e79a6b20a5087c75aa9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b09fe67b03c405c2d10656dbdebb20859a59de6a9e5eb803e7c7d578b736c827
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926
b194e718570b321359cdb523a5ed73b7c396150aaffdc5fece2a3e7659c12605
b304a662c0afc3404a1babc46805ff9f4a6b83a4853721c2e1890940c11c36ff
b7423f3ee15c4bef2886b80f5db2fa16bac4245f4a88d6efbf9c209f66e36817
b82931be1bcd802496f9e5a0cecc716b764b332d41dc3f91bb273c9c2a87addb
b94da20440317fec9c46406aa39cd2e8aebbdb377bbb56c3b9bd5a3c2abf1af7
ba263519f68b1d67e565e36be4ec1f7cb9435e7bbf7984b53a399b99e52c86de
ba858de50dbe28aca66d51f275b0e7a2be3dae6ee1c6e74798b4655575a897bc
be0a3204975d1f5503f91bf8596930becdfefec88034e1852d2d075308a6bdb9
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c2088d78cab052f661280ebe9df7a1d0d3c3f0c8fcf0e16aa03868b35c1815d9
c66d3c57676253019cfd4315afeead909efc06b27b54a85a6debce549fb1f53e
c745e8a9de5723ee3842f6a4ec315c5c56f6a29519dc70307c4fda58dcbb0d66
c7a56f39623c6edcbae8e2cfd8cb738cae33dccb4580b2574607624dbb468043
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
c872510d9beca2adca7dc000239c71c9d54c03f3fc805833a661de6a23a2e4ec
c894038ee188c223e93dd1d92a606be67b9590fb3e4a6a0dc484bf3ae961c6ed
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d032695018480726794e6e6eff112f7116a5122bb269d22dc77f3516604a1c1e
d665ad6762076513f3ad8d02bc1246a6bcf75d4df5da456aae49976b2243adf7
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
d9d50f91b9fa32568a08b88e9758859316046c7ee530542cf3a7dd6bd334d657
dba039a16776e5e34b45bb458e5fb1b6778383091e04d0bff93c43f3ed341155
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b
dd93ca83e5a29b494b970f63833ffec494690063a0ef5bafca4c4d9c889e5fdc
dfc3f558d7ab9659f6fc3a1c61fa7c5c6c905adecd8bff069652254c13f84b9b
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e4e5ee42d5bf59640b6c8cc1429b54065f5c71df4b1bb4d48fd7263e752d2f21
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
eeeadfeed3d3cf8974df0e53ef6a002dcaa84433c501fcc574416d5af9bc645e
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
ef810de0980850829ba1d87d80614e11d0466743b96adc89ad67a9d242500459
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
fda97ec20907646eef81309463a8f352dd07cb189eabb717c66fc1757c8c6f3f
fdc67ef7708016ab64a6645f0a07c349c31f8dde9934d21f13083f3e3241fb72
fe1bbf3a4709b2bb555a2487c8e3acc410817f8935529e2a971d0687f9e7f9d4